9

contactsListreadContacts() विधि निष्पादित होने तक खाली है, दूसरे शब्दों में, contactsView.setAdapter(adapter) निष्पादित किया गया था, contactsList खाली है, तो यह कोड अभी भी संपर्कों की जानकारी को सही तरीके से क्यों दिखा सकता है?मुझे Adapter.notifyDataSetChanged() का उपयोग करने की आवश्यकता क्यों नहीं है?

public class MainActivity extends AppCompatActivity { 

ListView contactsView; 
ArrayAdapter<String> adapter; 
List<String> contactsList = new ArrayList<String>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    contactsView = (ListView) findViewById(R.id.contacts_list); 
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contactsList); 
    contactsView.setAdapter(adapter); 
    readContacts(); 
} 

private void readContacts() { 
    Cursor cursor = null; 
    try { 
     cursor = getContentResolver().query(
       ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
       null, null, null, null); 
     while (cursor.moveToNext()) { 
      String displayName = cursor.getString(cursor.getColumnIndex(
        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME 
      )); 
      String number = cursor.getString(cursor.getColumnIndex(
        ContactsContract.CommonDataKinds.Phone.NUMBER 
      )); 
      contactsList.add(displayName + "\n" + number); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (cursor != null) { 
      cursor.close(); 
     } 
    } 
    } 
} 

लेकिन अगर मैं कुछ इस तरह जोड़ने के लिए, मैं notifyDataSetChanged() कॉल करनी होगी:

add.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      contactsList.add("blabla"); 
      adapter.notifyDataSetChanged(); 
     } 
    }); 

add बटन है। अब एंड्रॉइड स्वचालित रूप से विधि को कॉल करेगा, क्यों adapter.notifyDataSetChanged(); हटाएं यूआई रीफ्रेश नहीं कर सका?

उत्तर

0

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

आशा है कि मैंने इसे थोड़ा स्पष्ट कर दिया है ...!

++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++ प्रश्न संपादित करने के बाद जवाब, इस संबंध में अपने स्वयं के विचार और समझ रखने के बाद:

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

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

+0

धन्यवाद!लेकिन मेरे पास एक नया सवाल है, उपरोक्त में रीफ्रेश करें :) – HungryMilk

+0

@ हंगरी मिल्क हाय अपडेटेड स्पष्टीकरण पर एक नज़र डालें और यदि यह इसे उत्तर के रूप में स्वीकार करने में मदद करता है :) –

+0

क्षमा करें, मैं भूल गया! धन्यवाद :) – HungryMilk

1

उस विधि को एंड्रॉइड फ्रेमवर्क में आंतरिक रूप से कहा जाता है। आपको इसे स्पष्ट रूप से कॉल करने की आवश्यकता नहीं है।

स्रोत: https://www.udacity.com/course/developing-android-apps--ud853

+0

मेरा मतलब है कि जब मैं एडाप्टर सेट करता हूं, तो सूची खाली होती है। और जब मैंने 'रीड कॉन्टैक्ट्स' का इस्तेमाल किया, तो सूची खाली नहीं हुई, लेकिन मैंने इसे रीफ्रेश करने के लिए 'notifydatachanged()' का उपयोग नहीं किया। तो क्यों सूचीदृश्य अभी भी जानकारी दिखा सकता है? – HungryMilk

+0

@ हंगरी मिल्क जब सूची की सामग्री बदल दी जाती है, तो एंड्रॉइड फ्रेमवर्क स्वचालित रूप से 'अधिसूचित डेटाटाँग() 'को कॉल करता है। तो आपको इसे स्वयं फोन करने की ज़रूरत नहीं है। – Lilylakshi

+0

धन्यवाद! लेकिन मेरे पास एक नया सवाल है, उपर्युक्त में ताज़ा करें :) – HungryMilk

0

लिली के जवाब देने के लिए इसके अलावा, यदि आप अपने खुद के एडाप्टर लिखते हैं, आप यह स्पष्ट रूप से कॉल करने के लिए की है।

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