De lijstweergave bijwerken wanneer de adaptergegevens veranderen

Als de gegevens die zijn gekoppeld aan de array-adapter worden gewijzigd, is het ongeldig maken van de lijstweergave voldoende om de bijgewerkte waarden weer te geven? Het volgende stukje code werkt niet, heb ik hier iets verkeerd begrepen?

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

Gebruikte lay-out:

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

Antwoord 1, autoriteit 100%

vervanging:

mMyListView.invalidate();

voor:

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

Als dat niet werkt, raadpleeg dan deze thread:
Android-lijstweergave vernieuwen


Antwoord 2, autoriteit 8%

Verander deze regel:

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

naar:

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

en na het bijwerken van de waarde van een lijstitem, bel:

adapter.notifyDataSetChanged();

Antwoord 3, autoriteit 2%

invalidate();roept de lijstweergave aan om zichzelf ongeldig te maken (bijv. achtergrondkleur)

invalidateViews();roept al zijn kinderen op om ongeldig te worden verklaard. zodat u de kinderweergaven kunt bijwerken

Ik neem aan dat het een soort efficiëntie-ding is dat voorkomt dat alle items constant opnieuw moeten worden getekend als dit niet nodig is.


Antwoord 4

Ik heb een oplossing gevonden die efficiënter is dan het momenteel geaccepteerde antwoord, omdat het huidige antwoord ervoor zorgt dat alle lijstelementen worden vernieuwd. Mijn oplossing ververst slechts één element (dat is aangeraakt) door adapters getView aan te roepen en de huidige weergave te recyclen, wat nog meer efficiëntie toevoegt.

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

Other episodes