एडेप्टर डेटा में परिवर्तन होने पर सूची दृश्य को अपडेट करना


104

जब एरे एडॉप्टर से जुड़े डेटा को बदल दिया जाता है, तो अद्यतन मानों को दिखाने के लिए सूची को अमान्य करना पर्याप्त है? निम्नलिखित कोड का काम नहीं कर रहा है, क्या मैंने यहां कुछ गलत समझा?

public class ZeroItemListActivity extends Activity {
    private ArrayList<String> listItems=new ArrayList<String>();
    private ListView mMyListView;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mMyListView=(ListView) findViewById(R.id.MyListView);
        mMyListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,listItems));
    }
    public void addItem(View v){
        listItems.add("list Item");
        mMyListView.invalidate();
    }
}

उपयोग किया गया लेआउट:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:text="@string/hello" />
    <ListView android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:id="@+id/MyListView"></ListView>
    <Button android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:id="@+id/AddItemsButton"
        android:text="Add Items" android:onClick="addItem"></Button>
</LinearLayout>

जवाबों:


172

विकल्प:

mMyListView.invalidate();

के लिये:

((BaseAdapter) mMyListView.getAdapter()).notifyDataSetChanged(); 

यदि वह काम नहीं करता है, तो इस थ्रेड को देखें: Android सूची दृश्य ताज़ा करें


@ब्लिंडस्टफ अगर मुझे सूची के एकल आइटम को अपडेट करना है तो मुझे क्या करना है
डेवलपर

BaseAdapter मौजूद नहीं है, notifyDataSetChanged () ताकि आप परिवर्तन करने की जरूरत है, नहीं दिखाया जाएगा BaseAdapterकरने के लिएYourCustomAdapter
जूनियर Mayhé

12

इस पंक्ति को बदलें:

mMyListView.setAdapter(new ArrayAdapter<String>(this, 
                           android.R.layout.simple_list_item_1, 
                           listItems));

सेवा:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                                   android.R.layout.simple_list_item_1, 
                                   listItems)
mMyListView.setAdapter(adapter);

और सूची आइटम के मूल्य को अपडेट करने के बाद, कॉल करें:

adapter.notifyDataSetChanged();

3

invalidate();अपने आप को अमान्य करने के लिए सूची दृश्य को कॉल करता है (अर्थात पृष्ठभूमि का रंग)
invalidateViews();अपने सभी बच्चों को अमान्य कहता है। आपको बच्चों के विचारों को अपडेट करने की अनुमति देता है

मुझे लगता है कि इसकी कुछ प्रकार की दक्षता चीज़ों को रोकना आवश्यक नहीं होने पर सभी वस्तुओं को लगातार लाल होना है।


2

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

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
      // Edit object data that is represented in Viewat at list's "position"
      view = mAdapter.getView(position, view, parent);
    }
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.