SORU
23 ŞUBAT 2010, Salı


Seçilen öğeyi (Liste Görünümü) Değiştirmek (Android)oluşmasına neden olan tespit

Kullanıcı uzun basın bağlam menüsünü almak sağlayacak ListView bir ben var. Yaşıyorum sorun ListItem onlar uzun süre basılı belirlenmesinde. Bunu yapmaya çalıştım:

myListView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
  @Override public void onCreateContextMenu(ContextMenu menu, final View v, ContextMenuInfo menuInfo) {
   menu.add("Make Toast")
    .setOnMenuItemClickListener(new OnMenuItemClickListener() {
     @Override public boolean onMenuItemClick(MenuItem item) {
      String toastText = "You clicked position "   ((ListView)v).getSelectedItemPosition();
      Toast.makeText(DisplayScheduleActivity.this, toastText, Toast.LENGTH_SHORT).show();
      return true;
     }
    });
  } 
 });

ama sadece ANR çıkana kadar kilitleniyor. Menü oluşturulduktan sonra ListItem artık seçili olduğunu sanıyorum.

Tıklama izlemek için bir yer gibi görünüyor ya da uzun tıklama sonra tıklandığında öğe yok kayıt:

 mArrivalsList.setOnItemLongClickListener(new OnItemLongClickListener() {
  @Override public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
   // record position/id/whatever here
   return false;
  }
 });

ama sakın bana kludgey hissediyor. Bu herkes için daha iyi çözümler var mı?

CEVAP
23 ŞUBAT 2010, Salı


Öncelikle, eğer işler biraz aşırı karmaşık View.setOnCreateContextMenuListener() kullanarak yapıyorsun merak ediyorum. Şeyler olursa o zaman sadece Activity.onCreateContextMenu() Activity.onContextItemSelected() menü olaylarını işlemek için kullanabilirsiniz, çünkü Activity.registerForContextMenu(), kullanırsanız çok daha kolay. Temelde tüm bu anonim iç sınıflar her olayı işlemek için tanımlamak zorunda kalmazsınız; sadece birkaç Aktivite bir yöntem bu bağlam menü olaylarını işlemek için geçersiz kılmak gerekir.

İkinci olarak, şu anda seçili öğeyi Geri almak kesinlikle daha kolay yolları var. Tüm yapmanız gereken Adapter doldurmak için kullanılan ListView ya da bir başvuru tutmak. Kullanabilirsiniz ContextMenuİnfo gibi bir AdapterContextMenuİnfo almak için pozisyon öğe; ve sonra da kullanmak ListView.getItemAtPosition() Adapter.getItem() almak için Object özellikle bağlantılı neydi tıkladım. Örneğin, ** 16 yaşında, ben kullanıyorum diyelim bunu yapabilir:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);

    // Get the info on which item was selected
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;

    // Get the Adapter behind your ListView (this assumes you're using
    // a ListActivity; if you're not, you'll have to store the Adapter yourself
    // in some way that can be accessed here.)
    Adapter adapter = getListAdapter();

    // Retrieve the item that was clicked on
    Object item = adapter.getItem(info.position);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    // Here's how you can get the correct item in onContextItemSelected()
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    Object item = getListAdapter().getItem(info.position);
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • graham025

    graham025

    25 NİSAN 2006
  • Justin Schenck

    Justin Schen

    24 Kasım 2006
  • TheJoeycool2010

    TheJoeycool2

    12 Temmuz 2010