Adaptör verileri değiştiğinde liste görünümünü güncelleme


104

Dizi bağdaştırıcısı ile ilişkili veriler değiştirildiğinde, liste görünümünün geçersiz kılınması güncellenmiş değerleri göstermek için yeterli mi? Aşağıdaki kod parçası çalışmıyor, burada bir şeyi yanlış mı anladım?

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

Kullanılan düzen:

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

Yanıtlar:


173

vekil:

mMyListView.invalidate();

için:

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

Bu işe yaramazsa, şu konu başlığına bakın: Android Liste görünümü yenileme


@blindstuff eğer liste görünümünün tek bir öğesini güncellemem gerekirse, o zaman ne yapmam gerekir
Geliştirici

BaseAdapter yoksa sen değişikliğine ihtiyaç böylece, notifyDataSetChanged (), görünmeyecektir BaseAdapteriçinYourCustomAdapter
Genç mayhe

12

Bu satırı değiştirin:

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

to:

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

ve bir liste öğesinin değerini güncelledikten sonra şunu arayın:

adapter.notifyDataSetChanged();

3

invalidate(); kendini geçersiz kılmak için liste görünümünü çağırır (yani arka plan rengi)
invalidateViews(); tüm alt öğelerini geçersiz kılınmaya çağırır. çocuk görünümlerini güncellemenize izin verir

Tüm öğelerin gerekli değilse, sürekli olarak yeniden çizilmesini engelleyen bir tür verimlilik şeyi olduğunu varsayıyorum.


2

Şu anda kabul edilen cevaptan daha verimli bir çözüm buldum, çünkü mevcut cevap tüm liste öğelerini yenilenmeye zorluyor. Çözümüm, adaptörleri getView çağırarak ve mevcut görünümü geri dönüştürerek (dokunulan) yalnızca bir öğeyi yenileyecek ve bu da daha fazla verimlilik katacak.

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);
    }
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.