2012-03-09 10 views
8

मेरे पास सूची सूची में एक सूची दृश्य है जो कुछ डेटा से जुड़ा हुआ है। मेरे पास एक सामग्री प्रदाता है जो डेटा प्रदान कर रहा है।एंड्रॉइड लिस्ट व्यू लाइव अपडेट

ListActivity एक सामग्री समाधानकर्ता पूछताछ की डेटा हो जाता है:

Uri uri = Uri.parse("content://my.provider.DocumentProvider/mystuff"); 
contentCursor = this.getContentResolver().query(uri, null, null, null, null); 

तो अब गतिविधि कर्सर है। यह एक एडाप्टर बनाता है और इसे सूची में जोड़ता है:

ListAdapter adapter = new DocumentListCursorAdapter(this, R.layout.main_row_layout, contentCursor, new String[] { "titleColumn" }, new int[] { titleColumnIndex }); 
setListAdapter(adapter); 

यह ठीक काम करता है; सूची कर्सर में डेटा दिखाती है।

लेकिन अब सामग्री प्रदाता के पास नया डेटा है। मैं सूची को नया डेटा दिखाने के लिए अद्यतन करना चाहता हूं।

मेरे द्वारा देखे गए उदाहरणों में एडाप्टर की अधिसूचनाडेटासेट चेंज किया गया है, लेकिन ऐसा लगता है कि यह सामग्री प्रदाता और सूची के बीच अलगाव को तोड़ता है, जो सामग्री का उपभोग कर रहा है।

क्या सामग्री प्रदाता को पता होना चाहिए कि कर्सर से कौन से एडाप्टर जुड़े हुए हैं ताकि यह उनकी अधिसूचनाडेटासेट चेंज विधि को कॉल कर सके? या क्या कोई बेहतर तरीका है जो इन दो चीजों को इस तरह से नहीं देखता है।

+0

क्या आपने http://developer.android.com/reference/android/content/ContentResolver.html#notifyChange%28android.net.Uri,%20android.database.ContentObserver,%20boolean%29 पर देखा है? – Luksprog

+0

मैंने रजिस्टरकंटेंट ऑब्सर्वर के साथ पंजीकरण करने का प्रयास किया था, लेकिन जब कर्सर बदल गया तो कोई बदलाव नहीं आया। क्या यह काम करना चाहिए? – stevex

+0

स्लुकियन के समान ही, आपको 'contentCursor.setNotificationUri (cr, uri) की आवश्यकता हो सकती है; ' – njzk2

उत्तर

6

मैं इस सवाल का जवाब मिला:
उसके लिए सिर्फ इस प्रयास करें:

http://mylifewithandroid.blogspot.com/2008/03/observing-content.html

एक nutshel में एल, प्रदाता संकेत मिलता है कि यूआरआई पर सामग्री बदली है notifyChange कॉल:

getContext().getContentResolver().notifyChange(uri, null); 

और ListActivity कि यह रुचि है रजिस्टर करने के लिए परिवर्तनों की सूचना प्राप्त करने में कर्सर पर setNotificationUri कॉल:

contentCursor.setNotificationUri(getContentResolver(), uri); 

(सही दिशा में मुझे इंगित करने के लिए धन्यवाद njzk2)।

+0

मेरे पहले कुछ सेकंड पहले – Selvin

+1

हाय, मैं एक ही समस्या पर काम कर रहा हूं। मेरे पास एक कस्टम बेस एडाप्टर है और मैं सामग्री प्रदाता से प्राप्त कर्सर को एडाप्टर में पास करता हूं। अब आपके क्यू एंड ए के आधार पर यदि मैं पूछ सकता हूं, दस्तावेज 'setNotificationUri' से ** ** Resolver ** से जुड़े श्रोता को सूचित करता है। Listview को अपडेट करने के लिए इसका उपयोग कैसे कर रहे हैं? क्या आप ContentObserver का उपयोग नहीं कर रहे हैं? –

+0

क्या यूआरआई सिर्फ एक निर्मित मूल्य है? मुझे कैसे पता चलेगा कि मेरा यूआरआई गलती से कुछ अन्य ऐप के यूआरआई जैसा नहीं है? –

0

आपका मतलब है, आप डेटा के अनुसार सूची अपडेट करना चाहते हैं। ..
जब आप नए कर्सर मिलता है तो बस इस कोड डाल बजाय सूची नया एडाप्टर सेट

adapter.notifyDatasetChanged(); 

और

listview.invalidate() 
+0

मुझे कैसे पता चलेगा कि नया कर्सर कब प्राप्त करें? डेटा बदल गया है (उदाहरण के लिए, कुछ नेटवर्क गतिविधि के कारण - नया डेटा प्राप्त हुआ) और सामग्री प्रदाता को पता है कि डेटा बदल गया है। ListActivity के माध्यम से अधिसूचना प्राप्त करने के लिए सामग्री प्रदाता क्या करता है? यदि आप प्रदाता मानते हैं और सूची एक ही ऐप में है, तो यह हल करने में काफी आसान है, लेकिन यदि सामग्री प्रदाता किसी भिन्न प्रक्रिया में किसी सूची से कनेक्ट होता है तो क्या होगा? सामग्री प्रदाता सूची में कहां परिवर्तन को संवाद करने के लिए क्या करता है? – stevex

+0

क्या हमें दोनों को या 'adapter.notifyDatasetChanged() 'सूची दृश्य अपडेट करने की आवश्यकता है? –

1

asuming कि ContentProvider तुम्हारा है आप सी.पी. के अपने query कार्यान्वयन में cursor.setNotificationUri(getContext().getContentResolver(), uri); जोड़ना चाहिए, (आप कर्सर वापसी से पहले) और getContext().getContentResolver().notifyChange(uri, null);update में insert, delete ... SimpleCursorAdapter जो prolly सूचीदृश्य ताज़ा के बारे में आपकी देखभाल DocumentListCursorAdapter लेना चाहिए का आधार है ।