2011-05-27 8 views
36

ile listeden seçilen öğeyi seçin Android geliştirmede yepyeni oldum ... iPhone ve .Net geçmişlerinden geliyor. Buna çok benzer sorular gördüm, ama bunların hiçbiri SimpleCursorAdapter ile ilgilenmedi. Bir öğe tıklandığında SonraSimpleCursorAdapter

ListAdapter adapter = new SimpleCursorAdapter(
     this, 
     android.R.layout.simple_list_item_1, 
     c,   
     new String[] {"name"}, 
     new int[] {android.R.id.text1}); 

setListAdapter(adapter); 

:

public void onListItemClick(ListView l, View v, int position, long id) { 

    super.onListItemClick(l, v, position, id); 

    //Difference between this: 
    Cursor c = (cursor)l.getItemAtPosition(position); 
    //and this?? 
    Cursor c = (Cursor)l.getAdapter().getItem(position); 

    int categoryId = c.getInt(0); 
} 

bu doğru yolu mu

benim ListView için bir SQLite sorgudan veri bağlamak için bir imleç kullanan bir temel ListActivity var Seçilen elemanın kimliğini almak için? Tuhaf görünüyor, çünkü veritabanı kapatıldıktan sonra imlecimi kullanabileceğimi düşünmüyordum (ki ben bağlandıktan sonra). Bu id dosyasındaki asıl öğeyi almanın bir yolunu göremediğimde, kimliği geçen nokta nedir? Ayrıca, getItemAtPosition() neden bir imleci döndüreceğini anlamıyorum ... imleç tüm listeye bağlı; sadece bir satır değil. Son olarak, eğer bu doğruysa, imleci almanın iki yolu arasında bir fark var mı? Teşekkürler.

cevap

81

Birkaç nokta: imleci getirdikten sonra, startManagingCursor numaralı telefonu aramak istiyorsunuz. Bu, imlecin yaşam döngüsünü Etkinlik'in yaşam döngüsü ile bağlar (Etkinlik Etkinleştirildiğinde imleç kapanır/temizlenir).

startManagingCursor(c); 
ListAdapter adapter = new SimpleCursorAdapter(
     this, 
     android.R.layout.simple_list_item_1, 
     c,   
     new String[] {"name"}, 
     new int[] {android.R.id.text1}); 
setListAdapter(adapter); 

Ayrıca, veritabanı kapatılmamış olduğunu İmleç genellikle DB (böylece ListView imlecin içeriğine gelecek erişimi gerektirebilir doğa şeyler kaydırma ve yapabileceği canlı bir bağlantı tutar.

Cursor c = ((SimpleCursorAdapter)l.getAdapter()).getCursor(); 
c.moveToPosition(position); 

ardından id sütunu a getirilen varsayarak (id almak c.getLong(0) kullanabilirsiniz: çekirdek sorusuna onListItemClick bunu yapmanın en kolay yolu için

şudur genellikle ilk sütun olan). Ancak, kimlik imzanın bir parçası olarak geçtiğine dikkat edin (public void onListItemClick(ListView l, View v, int position, long id)'daki son bağımsız değişkene bakın), böylece gerçekten yeniden getirmeniz gerekmez (ancak döngüleri yakmak isterseniz kesinlikle yapabilirsiniz). Diğer sütunlara erişmek için aynı şeyi yapabilirsiniz, sadece sütun dizinini değiştirin.

Bu yardımcı olur umarım.

+0

teşekkürler! StartManagingCursor'u arıyordum, ama neden şimdi anlayamadım! Birkaç soru ... Yani, SQLiteDatabase.close() yöntemini çağırdığımda bile, bu imlecin buna erişmesini engellemez mi? ListView bir getCursor() yöntemine sahip görünmüyor. Son olarak, yöntemime iletilen kimlik, veritabanımdaki kimlik otomatik olarak mı? Teşekkürler! – GendoIkari

+1

Ah, eğer 'close' iseniz, ListView'iniz muhtemelen çalışmayı durduracaktır: genel olarak yaptığım şey, Application nesnesini veritabanı bağdaştırıcım olarak yeniden kullanıyorum: "onCreate" içinde açıp "onTerminate" öğesini kapatıp sonra da bunu bağlamak için kullanıyorum uygulamanın yaşam döngüsüne veritabanı bağlantısı yaşam döngüsü. 'GetCursor' kadarıyla, benim hatam: 'İmleç c = ((SimpleCursorAdapter) l.getAdapter()) olmalıdır getCursor();'. Ve evet, kimlik veritabanından çıkan şey: oldukça uygun. – Femi

+0

Yardımlarınız için tekrar teşekkürler! – GendoIkari

0

bir başka yolu:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View arg1, int position, long arg3) { 

      Cursor cursor = (Cursor) parent.getAdapter().getItem(position); 
      //TODO 
      } 
});