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