[android] Aktualisieren der Listenansicht, wenn sich die Adapterdaten ändern



Answers

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

Nach dem Aktualisieren des Werts eines Listenelements rufen Sie Folgendes auf:

adapter.notifyDataSetChanged();
Question

Wenn die mit dem Array-Adapter verbundenen Daten geändert werden, reicht es aus, die Listenansicht zu ungültig zu machen, um die aktualisierten Werte anzuzeigen? Das folgende Code-Stück funktioniert nicht, habe ich 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();
    }
}

Layout verwendet:

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



Ich habe eine Lösung gefunden, die effizienter ist als die derzeit akzeptierte Antwort, da die aktuelle Antwort alle Listenelemente zum Aktualisieren zwingt. Meine Lösung aktualisiert nur ein Element (das berührt wurde), indem sie die Adapter getView aufruft und die aktuelle Ansicht recycelt, was zu noch mehr Effizienz führt.

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




Related



Tags

android android