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>
Suresh
quelle

Antworten:

172

Ersatz:

mMyListView.invalidate();

zum:

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

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

Blindware
quelle
@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();
ritesh4326
quelle
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.

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