108 Stimmen

Aktualisieren der Listenansicht, wenn sich die Adapterdaten ändern

Wenn die mit dem Array-Adapter verbundenen Daten geändert werden, reicht es aus, die Listenansicht zu invalidieren, um die aktualisierten Werte anzuzeigen? Der folgende Code funktioniert nicht, habe ich hier etwas missverstanden?

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>

175voto

blindstuff Punkte 18030

Ersatz:

mMyListView.invalidate();

für:

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

Wenn das nicht funktioniert, lesen Sie diesen Thread: Android Listenansicht aktualisieren

14voto

ritesh4326 Punkte 677

Ä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);

und nach der Aktualisierung des Wertes eines Listenelements aufrufen:

adapter.notifyDataSetChanged();

3voto

user3044482 Punkte 416

invalidate(); ruft die Listenansicht auf, sich selbst ungültig zu machen (z. B. Hintergrundfarbe)
[invalidateViews();](http://developer.android.com/reference/android/widget/AbsListView.html#invalidateViews()) alle seine untergeordneten Ansichten für ungültig erklärt, damit Sie die untergeordneten Ansichten aktualisieren können

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

2voto

Ignas Punkte 347

Ich habe eine Lösung gefunden, die effizienter ist als die derzeit akzeptierte Lösung, da die derzeitige Lösung alle Listenelemente zum Aktualisieren zwingt. Meine Lösung aktualisiert nur ein Element (das berührt wurde), indem der Adapter getView aufruft und die aktuelle Ansicht recycelt, 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);
    }
});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X