2012-02-13 25 views
9

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

मैंने हर बार एक नया एडाप्टर उदाहरण बनाकर ListView.setAdapter() का उपयोग करके शुरुआत की, लेकिन this discussion के अनुसार मुझे इसे रीसेट करने के बजाय एडाप्टर अपडेट करना चाहिए। मुझे SimpleCursorAdapter के लिए ऐसा करने का कोई तरीका नहीं मिल रहा है जो सही तरीके से काम करता है। SimpleCursorAdapter.changeCursorAndColumns() एक ताजा कर्सर के साथ सफलतापूर्वक एडाप्टर अद्यतन करता है, लेकिन अभी भी पुस्तक स्थिति रीसेट करता है -
:

ये कुछ चीजें हैं मैं कोशिश की है, विधि तर्क को छोड़ते हुए हैं।
- SimpleCursorAdapter.changeCursor() वही तरीके से कार्य करता है।
- SimpleCursorAdapter.swapCursor() एपीआई 11 तक उपलब्ध नहीं है, और मैं एपीआई 8 के लिए विकास कर रहा हूं।
- SimpleCursorAdapter.notifyDataSetChanged() ListView को अपडेट नहीं करता है। (शायद एक और कदम है जो मुझे याद आ रहा है।)
- ListView.invalidate() ListView को अपडेट नहीं करता है।
- SimpleCursorAdapter.requery() ListView को खाली बनाता है, और इसे हटा दिया गया है।
- मैं ListView.setSelection() समाधान से परिचित हूं, लेकिन मैं नहीं चाहता कि मेरी सूची दृश्य अपडेट होने पर भी आगे बढ़ें। यह सूची में एक स्थिति में snaps।

ऐसा लगता है कि यह एक आम और सरल समस्या होनी चाहिए। क्या किसी ने इसका सामना किया है?

+0

जवाब नीचे मेरी टिप्पणी देखें होने के साथ मेरे लिए काम किया

Cursor cursor = mDataHelper.getWritableDatabase().query( DataContract.Incares.TABLE_NAME, // Table to Query null, // all columns null, // Columns for the "where" clause null, // Values for the "where" clause null, // columns to group by null, // columns to filter by row groups DataContract.Incares.UUID +" DESC" // sort order ); CursorAdapter.swapCursor(cursor); CursorAdapter.notifyDataSetChanged(); 

इस्तेमाल किया। SimpleCursorAdapter.change कर्सर() सही ढंग से काम करता है - मेरे पास बस कोड की एक और पंक्ति खराब चीजें थीं। – pvans

उत्तर

5

मुझे एक ही समस्या है: जब भी कर्सर की सामग्री बदल जाती है तो मेरा कर्सर एडाप्टर स्क्रॉल स्थिति को रीसेट कर देता है।

मुझे एहसास नहीं हुआ कि मैंने वास्तव में डेटा बदलते समय हर बार एक नया सूची एडाप्टर सेट किया था। मैंने सोचा कि कर्सर स्वयं एडाप्टर को इसकी सामग्री में बदलावों के बारे में सूचित करेगा, लेकिन मेरे मामले में यह ContentProvider है जो LoaderManager.LoaderCallbacks.onLoadFinished() को मेरी ListFragment में ट्रिगर करता है। उस कॉलबैक में अब मैं एक नया एडाप्टर बनाने के बजाय CursorAdapter.changeCursor() का उपयोग करता हूं और सब कुछ ठीक काम करता है।

मुझे आशा है कि इससे आपकी समस्या को हल करने में मदद मिलेगी। पोस्ट में Async कार्य के अमल

+0

यह पता चला है कि SimpleCursorAdapter.changeCursor() सही ढंग से काम करता है। मेरे मामले में अपराधी सूची दृश्य स्क्रॉल स्थिति को रीसेट करने के कारण कर्सर को बदलने से पहले कोड की रेखाओं की एक जोड़ी थी: 'ListView.SetDivider()' और 'ListView.SetDividerHeight'। वास्तव में गुस्से वाला। मेरे पास 'ListView.setCacheColorHint()' लाइन भी है, जो स्क्रॉल स्थिति को रीसेट करने के लिए _not_ नहीं करता है। – pvans

0

ही था निम्नलिखित कोड CursorAdapter एक वैश्विक चर