Aktualisieren der Listenansicht, wenn sich die Adapterdaten ändern


104

Wenn die dem Array-Adapter zugeordneten Daten geändert werden, reicht es aus, die Listenansicht ungültig zu machen, um die aktualisierten Werte anzuzeigen. Der folgende Code funktioniert nicht. Habe ich hier etwas falsch verstanden?

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

Verwendetes Layout:

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

Antworten:


172

Ersatz:

mMyListView.invalidate();

zum:

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

Wenn dies nicht funktioniert, lesen Sie diesen Thread: Aktualisierung der Android- Listenansicht


@blindstuff Wenn ich das einzelne Element der Listenansicht aktualisieren muss, dann was ich tun muss
Entwickler

Wenn BaseAdapter nicht vorhanden ist, wird notifyDataSetChanged () nicht angezeigt, sodass Sie BaseAdapterzuYourCustomAdapter
Junior Mayhé

12

Ändern Sie diese Zeile:

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

zu:

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

Rufen Sie nach dem Aktualisieren des Werts eines Listenelements Folgendes auf:

adapter.notifyDataSetChanged();

3

invalidate(); ruft die Listenansicht auf, um sich selbst ungültig zu machen (dh Hintergrundfarbe)
invalidateViews(); ruft alle untergeordneten Elemente auf, um ungültig zu werden. So können Sie die untergeordneten Ansichten aktualisieren

Ich gehe davon aus, dass es sich um eine Art Effizienz handelt, die verhindert, dass alle Elemente ständig neu gezeichnet werden müssen, wenn dies nicht erforderlich ist.


2

Ich habe eine Lösung gefunden, die effizienter ist als die derzeit akzeptierte Antwort, da die aktuelle Antwort das Aktualisieren aller Listenelemente erzwingt. Meine Lösung aktualisiert nur ein Element (das berührt wurde), indem die Adapter getView aufgerufen und die aktuelle Ansicht recycelt werden, was die Effizienz noch weiter erhöht.

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);
    }
});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.