适配器数据更改时更新列表视图

当与数组适配器关联的数据发生更改时,使列表视图失效足以显示更新的值? 以下的代码不工作,我误解了这里的东西?

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

使用的布局:

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

替代:

 mMyListView.invalidate(); 

对于:

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

如果这不起作用,请参阅此线程: Android列表视图刷新

改变这一行:

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

至:

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

在更新列表项的值后,调用:

 adapter.notifyDataSetChanged(); 

invalidate(); 调用列表视图来使自己失效(即背景色)
invalidateViews(); 呼吁所有的孩子失效。 允许您更新子视图

我认为它的某些types的效率的东西,防止所有的项目不断必须重绘,如果没有必要的话。

我发现了一个比当前接受的答案更有效的解决scheme,因为当前的答案会强制刷新所有列表元素。 我的解决scheme将通过调用适配器getView和回收当前视图刷新只有一个元素(被触摸),这增加了更多的效率。

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