सूचित करेंडेटाशैन्ड उदाहरण


166

मैं अपने में उपयोग करने के लिए कोशिश कर रहा हूँ एक के लिए विधि है, लेकिन यह मेरे लिए काम नहीं करता।Android ApplicationnotifyDataSetChanged()ArrayAdapter

मुझे यहां उत्तर के रूप में मिला , जो notifyDataSetChanged()मुख्य धागे में चलना चाहिए, लेकिन उसके लिए कोई उदाहरण नहीं था।

किसी को भी एक उदाहरण या कम से कम एक लिंक भेज सकता है ?!



आप इस ब्लॉग और जीथब में इस उदाहरण की जाँच कर सकते हैं और साथ ही
काबिजेस

जवाबों:


328

एक के लिए ArrayAdapter, notifyDataSetChangedकेवल यदि आप का उपयोग काम करता है add(), insert(), remove(), और clear()एडाप्टर पर।

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

आपकी पसंद हैं:

  1. के कार्यों का उपयोग ArrayAdapterअंतर्निहित सूची बदलना चाहते हैं ( add(), insert(), remove(), clear(), आदि)
  2. ArrayAdapterनए Listडेटा के साथ फिर से बनाएँ । (बहुत सारे संसाधनों और कचरा संग्रह का उपयोग करता है।)
  3. से प्राप्त अपनी खुद की कक्षा बनाएँ BaseAdapterऔर ListAdapterयह अंतर्निहित Listडेटा संरचना को बदलने की अनुमति देता है ।
  4. notifyDataSetChanged()हर बार सूची अपडेट होने पर उपयोग करें । यूआई-थ्रेड पर कॉल करने के लिए, का उपयोग runOnUiThread()की Activity। फिर, notifyDataSetChanged()काम करेंगे।

13
सावधान रहें, अपने डेटा में 'नई' ऑब्जेक्ट असाइन करने के लिए भी। स्पष्ट () का उपयोग करें, डेटा को फिर से खोलें / बदलें, फिर कॉल करें InformDataSetChanged ()
चांदनीचेती

लेकिन क्या होगा अगर हम notifyDataSetChanged()इस तरह से कॉल करें ((BaseAdapter) arrayAdapter).notifyDataSetChanged();:?
तैओरिक

2
मैं BaseExpandableListAdapter का उपयोग करता हूं, इसमें मेरे मैप को सदस्य चर के रूप में जोड़ने () या निकालने () फ़ंक्शन नहीं हैं। मैं मैप अपडेट करता हूं और नोटिफाइडसेटचैनड () को कॉल करता हूं, लेकिन कुछ नहीं होता है। जब मैं पसंद # 4 का उपयोग करता हूं, तो यह काम करता है। क्यों???
पन्नाधाय

मैं कस्टम ग्रिड के लिए ArrayAdapter का उपयोग कर रहा हूं, मैं छवियाँ जोड़ रहा हूं क्योंकि मैं उन्हें एडाप्टर.add (dataReceived) कॉल करके यूआरएल से प्राप्त करता हूं। यह ठीक काम करता है डेटा जोड़ता है लेकिन यह ताज़ा क्यों है और शीर्ष पर जा रहा है। मैं आइटम दिखाना चाहता हूं क्योंकि उन्हें बिना रिफ्रेशिंग लिस्ट के ऐड मिल जाएंगे। (क्या करना चाहते हैं, Android के ग्रिडड्यू के साथ काम कर रहा है। InformDatasetChanged () का उपयोग करके) मैं इस customGridView (StaggeredGridView) में कैसे काम कर सकता हूं।
मोबाइलएवेंजेलिस्ट

1
मैंने सूची में छँटाई के तरीकों को जोड़ने के लिए अपना स्वयं का आधार एडेप्टर बनाने की कोशिश की, लेकिन किसी कारण से यह काम नहीं करेगा। ऐसा नहीं है कि मेरा ऐप धीमा है भले ही मैं पूरे एडेप्टर को एक सॉर्ट की गई सरणी सूची के साथ फिर से बनाता हूं, लेकिन यह अभी भी मुझे परेशान करता है। हालांकि यह वास्तव में बहुत सारा कचरा कैसे पैदा करेगा? मुझे लगता है कि महंगा डेटा के वास्तविक सरणी को एडेप्टर को कॉल करने वाली गतिविधि में एक संदर्भ के रूप में रखा गया है, जिसका अर्थ है कि केवल एडेप्टर एकत्र किया जाएगा।
G_V

34

आप runOnUiThread()निम्नानुसार विधि का उपयोग कर सकते हैं । यदि आप a का उपयोग नहीं कर रहे हैं ListActivity, तो अपने संदर्भ के लिए कोड को अनुकूलित करें ArrayAdapter

final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
    public void run() {
        adapter.notifyDataSetChanged();
    }
});

1
मैंने अपने कोड में आप के कोड के टुकड़े को जोड़ने की कोशिश की (आप इसे पा सकते हैं यहां onCreate-method में stackoverflow.com/questions/3667442/how-to-refresh-adapter ), लेकिन मुझे अभी भी कोई सफलता नहीं मिली है :( शायद इसे जोड़ने के लिए गलत जगह थी?
Tima

1
आपके प्रश्न ने केवल यह पूछा कि आप विधि को कैसे कॉल कर सकते हैं और यह मुख्य UI थ्रेड में चलता है। यह उस सवाल का जवाब देता है। आपके विशेष मामले में ( stackoverflow.com/questions/3670500/… ) AsyncTask और इसकी onPostExecute () विधि वह प्रतीत होती है, जिस पर आपको विचार करना चाहिए।
ब्रायन

12

मैंने हाल ही में इस विषय पर लिखा है, हालांकि यह पोस्ट पुरानी है, मैंने सोचा कि यह किसी ऐसे व्यक्ति के लिए उपयोगी होगा जो जानना चाहता है कि BaseAdapter.notifyDataSetChanged()कदम से कदम और सही तरीके से कैसे लागू किया जाए ।

कृपया Android या नए ब्लॉग BaseAdapter.notifyDataSetChanged () में BaseAdapter.notifyDataSetChanged () को सही ढंग से लागू करने का पालन करें


हाय मैं पहले लिंक उदाहरण की कोशिश की, लेकिन के बजाय mItem.add(), मैं सिर्फ एक तत्व का संपादन किया है जैसे mItem.get(position).setImage(encodedImage)कि क्यों यह त्रुटि दे रहा है हो सकता है NullPointer exeption.So, बस इसे संपादित करने पर काम करता है, इसे संपादित करने के लिए अधिसूचित किया गया है। केवल ऐड (), क्लियर (), रिमूव () आदि के लिए
श्रीकांत एन

InformDataSetChanged डेटा सेट को संपादित करने या संशोधित करने के लिए काम करेगा, आपका अशक्त सूचक कुछ और होने के कारण, लॉग की जाँच करें।
आरिफ नदीम

7

मुझे एक ही समस्या थी और मैं लगातार नए उदाहरण के साथ पूरे ऐरे एडेप्टर को बदलना पसंद नहीं करता। इस प्रकार मैं AdapterHelper हैवी लिफ्टिंग कहीं और करते हैं।

इसे वहां जोड़ें जहां आप सामान्य रूप से सूचित करने का प्रयास करेंगे

new AdapterHelper().update((ArrayAdapter)adapter, new ArrayList<Object>(yourArrayList));
adapter.notifyDataSetChanged();

एडेप्टर हेल्पर क्लास

public class AdapterHelper {
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public void update(ArrayAdapter arrayAdapter, ArrayList<Object> listOfObject){
        arrayAdapter.clear();
        for (Object object : listOfObject){
            arrayAdapter.add(object);
        }
    }
}

मेरे पास मेरे कोड में कुछ अन्य ArrayAdapters हैं और उन्होंने बिना किसी समस्या के काम किया है। आज रात, मैंने एक SimpleCursorAdapter को एक ArrayAdapter में बदलने का फैसला किया, और यह काम नहीं करेगा। कुछ घंटों तक इसके साथ संघर्ष करने और एक कारण खोजने की कोशिश करने के बाद कि यह काम क्यों नहीं करेगा, मुझे आपका एडॉप्टर हेल्पर वर्ग मिला, और अब यह काम करता है! धन्यवाद!
गर्वजेकदाद ४

1
यह आसानी से एक समारोह में किया जा सकता है ... आप इसके लिए एक नए वर्ग को तुरंत क्यों भेजेंगे?
techiServices

2
जावा कार्यों में विधियों को कहा जाता है। आप क्या प्रस्ताव रखेंगे, यह उसी श्रेणी में पुनः प्रयोग करने योग्य तरीका है जैसा कि शायद एरियर एडेप्टर में है? या फ्रैगमेंट / गतिविधि जिसमें सूची दृश्य है? तो हां, इसका एक ऐसी कक्षा में जहां इसका पुन: उपयोग किया जा सकता है। यदि आप इसे हर तरह से स्थिर बनाना चाहते हैं तो आगे बढ़ें।
केविन पार्कर

1
अछा सुझाव। एक और ArrayAdapter को नामित करने के लिए ArrayAdapterCompat को विस्तारित किया जाएगा और addAll (..) विधि को ओवरराइड किया जाएगा, क्योंकि यह केवल API 11 से उपलब्ध है। वहां, API स्तर की जाँच करें और super.addAll(..)API> 11 और super.add (।।) का उपयोग करें । ) तुम्हारी तरह पुनरावृति के साथ संयोजन में if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { super.addAll(items); } else { for (Object o : collection) { super.add(o); } }:। अब बस अपने नए एडेप्टर वर्ग से विस्तार करें।
कॉन्सुमियरर

उत्तम! बहुत बहुत धन्यवाद @ केविन - यह वास्तव में मुझे क्या चाहिए था!
किबी

3

मुझे पता है कि यह एक देर से प्रतिक्रिया है, लेकिन मैं एक समान मुद्दे का सामना कर रहा था और मैं इसे notifyDataSetChanged()सही जगह पर उपयोग करके हल करने में कामयाब रहा ।

तो मेरी स्थिति इस प्रकार थी।

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

यह कोड स्निपेट है जिसका उपयोग मैंने गतिविधि में किया था।

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) 
    {
        case R.id.action_new_forward:

            FragmentTab2.mListAdapter.notifyDataSetChanged();//this updates the adapter in my action bar tab
            Intent ina = new Intent(getApplicationContext(), MainActivity.class);
            ina.putExtra("stra", values1);
            startActivity(ina);// This is the code to start the parent activity of my action bar tab(fragment).
    }
}

यह गतिविधि कुछ डेटा को वापस FragmentTab2लौटाएगी और यह सीधे मेरी सूची को अपडेट कर देगी FragmentTab2

आशा है कि कोई इसे उपयोगी पाता है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.