Memperbarui tampilan daftar saat data adaptor berubah

104

Ketika data yang terkait dengan adaptor larik diubah, membatalkan tampilan daftar sudah cukup untuk menunjukkan nilai yang diperbarui? Bagian kode berikut tidak berfungsi, apakah saya salah paham tentang sesuatu di sini.?

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();
    }
}

Tata letak yang digunakan:

<?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>
Suresh
sumber

Jawaban:

172

pengganti:

mMyListView.invalidate();

untuk:

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

Jika tidak berhasil, lihat utas ini: Penyegaran tampilan Daftar Android

penutup mata
sumber
@blindstuff jika saya harus memperbarui satu item dari tampilan daftar maka apa yang harus saya lakukan
Pengembang
Jika BaseAdapter tidak ada, notifyDataSetChanged () tidak akan muncul, jadi Anda perlu mengubah BaseAdapterkeYourCustomAdapter
Junior Mayhé
12

Ubah baris ini:

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

untuk:

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

dan setelah memperbarui nilai item daftar, panggil:

adapter.notifyDataSetChanged();
ritesh4326
sumber
3

invalidate();memanggil tampilan daftar untuk membatalkan dirinya sendiri (mis. warna latar belakang)
invalidateViews();memanggil semua anaknya menjadi tidak valid. memungkinkan Anda memperbarui tampilan anak

Saya berasumsi itu adalah beberapa jenis efisiensi yang mencegah semua item terus-menerus harus digambar ulang jika tidak perlu.

pengguna3044482
sumber
2

Saya menemukan solusi yang lebih efisien daripada jawaban yang diterima saat ini, karena jawaban saat ini memaksa semua elemen daftar disegarkan. Solusi saya hanya akan menyegarkan satu elemen (yang tersentuh) dengan memanggil adaptor getView dan mendaur ulang tampilan saat ini yang bahkan menambahkan efisiensi lebih.

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);
    }
});
Ignas
sumber