2011-05-27 9 views
36

के साथ सूचीबद्ध सूची दृश्य से चयनित आइटम प्राप्त करें मैं एंड्रॉइड विकास के लिए नया ब्रांड हूं ... आईफोन और नेट पृष्ठभूमि से आ रहा हूं। मैंने इस के लिए बहुत ही समान प्रश्न देखे हैं, लेकिन उनमें से कोई भी SimpleCursorAdapter से निपटा नहीं है। जब एक आइटम क्लिक किया जाता हैSimpleCursorAdapter

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); 
} 

इस उचित तरीका है

मैं एक बुनियादी ListActivity जो मेरे ListView करने के लिए एक SQLite क्वेरी से डेटा बाध्य करने के लिए एक कर्सर का उपयोग करता है चयनित तत्व की आईडी प्राप्त करने के लिए? यह अजीब लगता है, क्योंकि मुझे नहीं लगता कि डेटाबेस बंद होने के बाद मैं अपने कर्सर का उपयोग कर सकता हूं (जो कि बाध्य होने के बाद है)। आईडी की बात क्या है, जब मुझे उस आईडी से वास्तविक वस्तु प्राप्त करने का कोई तरीका नहीं मिल रहा है? साथ ही, मुझे समझ में नहीं आता कि getItemAtPosition() कर्सर वापस क्यों करेगा ... कर्सर पूरी सूची से बंधे हैं; सिर्फ एक पंक्ति नहीं। अंत में, यदि यह सही है, तो कर्सर प्राप्त करने के दो तरीकों के बीच कोई अंतर है? धन्यवाद।

उत्तर

81

तो कुछ बिंदु: कर्सर लाने के बाद, आप startManagingCursor पर कॉल करना चाहते हैं। यह कर्सर की जीवन चक्र को गतिविधि के जीवन चक्र से जोड़ता है (इसलिए जब गतिविधि नष्ट हो जाती है तो कर्सर बंद हो जाता है/साफ हो जाता है)।

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); 

इसके अलावा, डेटाबेस बंद कर दिया नहीं है, कर्सर को आम तौर पर डीबी (ताकि ListView स्क्रॉल करें और है कि प्रकृति कि कर्सर की सामग्री के लिए भविष्य का उपयोग की आवश्यकता हो सकती की कर सकते हैं करने के लिए एक जीवित कनेक्शन रहता है।

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

फिर आप c.getLong(0) का उपयोग आईडी प्राप्त करने के लिए कर सकते हैं (यह मानते हुए उसकी पहचान स्तंभ एक दिलवाया:

अपने मूल प्रश्न, onListItemClick में यह करने के लिए सबसे आसान तरीका है करने के लिए यह है पहला कॉलम जो आम तौर पर मामला है)। हालांकि, ध्यान दें कि आईडी हस्ताक्षर के हिस्से के रूप में पारित की जाती है (public void onListItemClick(ListView l, View v, int position, long id) में अंतिम तर्क देखें) ताकि आपको वास्तव में इसे फिर से लाने की आवश्यकता न हो (लेकिन यदि आप चक्रों को जलाना चाहते हैं तो आप निश्चित रूप से कर सकते हैं)। अन्य कॉलम तक पहुंचने के लिए आप वही काम कर सकते हैं, बस कॉलम इंडेक्स बदलें।

उम्मीद है कि मदद करता है।

+0

धन्यवाद! मैं startManagingCursor को कॉल कर रहा था, लेकिन मुझे समझ में नहीं आया कि अब तक क्यों! कुछ सवाल ... तो जब भी मैं SQLiteDatabase.close() को कॉल करता हूं, तो यह मेरे कर्सर को इसे एक्सेस करने से नहीं रोकता है? और ListView में getCursor() विधि प्रतीत नहीं होती है। आखिरकार, मेरी विधि को पारित आईडी आईडी मेरे डेटाबेस से स्वचालित रूप से है? धन्यवाद! – GendoIkari

+1

आह, अगर आप 'क्लोज़' कहते हैं तो आपकी लिस्ट व्यू शायद काम करना बंद कर देगी: आम तौर पर मैं जो करता हूं वह है कि मैं अपने एप्लिकेशन ऑब्जेक्ट को अपने डेटाबेस एडाप्टर के रूप में पुन: उपयोग करता हूं: 'ऑनक्रेट' में खुलता है और 'टर्मिनेट' में बंद होता है और फिर टाई करने के लिए इसका उपयोग करता है ऐप के जीवन चक्र में डेटाबेस कनेक्शन लाइफसाइकिल। जहां तक ​​'getCursor', मेरी त्रुटि: यह 'कर्सर सी = ((SimpleCursorAdapter) l.getAdapter()) होना चाहिए। GetCursor();'। और हाँ, आईडी डेटाबेस से बाहर आता है: यह काफी सुविधाजनक है। – Femi

+0

आपकी मदद के लिए फिर से धन्यवाद! – GendoIkari

0

एक और तरीका है:

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 
      } 
}); 
संबंधित मुद्दे