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>
BaseAdapter
zuYourCustomAdapter
Ändern Sie diese Zeile:
zu:
Rufen Sie nach dem Aktualisieren des Werts eines Listenelements Folgendes auf:
quelle
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 aktualisierenIch 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.
quelle
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.
quelle