2011-11-21 12 views
5

के साथ Android ListView अद्यतन हे, मैं डेटाबेस में संग्रहीत प्रविष्टियों को प्रदर्शित करने के लिए एक सूचीदृश्य का उपयोग करता हूं। मेरे पास एक संपादन टेक्स्ट तत्व और एक बटन भी है जो डेटाबेस में EditText की सामग्री जोड़ता है। डेटाबेस सामग्री मैं SimpleCursorAdapter और निम्नलिखित रूप से भरें समारोह का उपयोग करने के दृश्य के लिए बाध्य करने के लिए:SimpleCursorAdapter

private void populate() { 
    cursor = dbAdapter.getAllItems(); 
    startManagingCursor(cursor); 

    String[] from = new String[] { DBAdapter.KEY_TASK }; 
    int[] to = new int[] { android.R.id.text1 }; 

    // Now create an array adapter and set it to display using our row 
    cursorAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, from, to); 
    list.setAdapter(cursorAdapter); 
} 

तो मैं एक नई प्रविष्टि कहा, बटन पर क्लिक करके मैं सूचीदृश्य ताज़ा करने के लिए चाहते हैं, लेकिन यह केवल पॉप्युलेट समारोह के साथ काम करता और सामान्य एडाप्टर फ़ंक्शन notifyDataSetChanged(); के साथ नहीं। क्या मेरे पास कोई बग है या क्या यह सूचीदृश्य रीफ्रेश करने का सही तरीका है?

उत्तर

8

क्या आपने this देखा है, swap cursor विधि का प्रयास किया है, या फिर बस setAdapter() पर कॉल करने का प्रयास किया?

मेरे पास एक समान समस्या थी जहां मुझे अपनी सूची अपडेट करने में नहीं मिला, और मैंने जो किया वह केवल एक ताज़ा करें ListView() विधि। अब आप इसे शुरुआत में अपने ऑनक्रेट() से कॉल कर सकते हैं, और जब भी कोई उपयोगकर्ता डीबी में कुछ जोड़ता है। यह सब एक कर्सर को सूचीदृश्य दोबारा बांधता है। सभी बहिष्करण विधियों (requery()) के साथ, और सूचित करने के साथ मुद्दोंडेटाट चेंज(), मैंने फैसला किया कि यह सबसे आसान तरीका था।

+0

बस उल्लेख करने के लिए: 'requery()' पहले से ही बहिष्कृत है। [दस्तावेज़ीकरण] (http://developer.android.com/reference/android/database/Cursor.html#requery()) इस पर एक स्पष्ट रिकॉर्ड है। – 87element

+0

मुझे पता है, मैंने सही वाक्य नहीं दिया है, इसे फिर से लिखा है:> – Jack

+0

हे जैक आपके उत्तर के लिए धन्यवाद, मैं देखता हूं कि मैं उपरोक्त कोड कहता हूं कि मेरा 'populate()' फ़ंक्शन मैं इसे कॉल करता हूं मेरी 'ऑनक्रेट()' विधि और यदि मैं "जोड़ें"-बटन पर क्लिक करता हूं। मैं केवल यह जानना चाहता था कि बेस एडाप्टर क्लास की सामान्य 'NotifyDataSetChanged()' विधि को कॉल करने के बजाय इस विधि को कॉल करने का यह एक अच्छा समाधान है या नहीं। –

2

इस लिंक देखें ... यह पुस्तक पर गतिशील सूचीदृश्य के लिए आकर्षण

Update SimpleCursorAdapter while maintaining scroll position in ListView

तरह काम करता है मैं डेटाबेस से नया आइटम जोड़ा .. मैं यहाँ गलती किया था .. मैं नई एडाप्टर बताए था प्रत्येक साधारण के लिए एक ही simplecursoradapter के लिए। नया एडाप्टर बनाने के बजाय। बस का उपयोग

adapter.changecursor(newcursorValue); 
adapter.notifydatasetChanged(); 
lsMedicine1.setSelectionFromTop(lsMedicine1.getLastVisiblePosition()-20, 0); 
1

आप notifyDataSetChanged() एडाप्टर पर पहले swapcursor() कॉल करने के लिए की जरूरत है।

संबंधित मुद्दे