notifyDataSetChanged示例
我想在我的Android Application中使用ArrayAdapter的notifyDataSetChanged()方法,但它不适用于我。
我在这里find答案 , notifyDataSetChanged()应该在主线程中运行,但没有这样的例子。
任何人都可以发送一个例子或至less一个链接?!
对于ArrayAdapter ,只有在适配器上使用add() , insert() , remove()和clear() , notifyDataSetChanged才能正常工作。
当构造一个ArrayAdapter ,它将保存传入的List的引用。如果您要传入一个属于Activity成员的List ,并稍后更改该Activity成员,那么ArrayAdapter仍然持有对原始List 。 适配器不知道您更改了活动中的List 。
您的select是:
- 使用
ArrayAdapter的函数来修改底层List(add(),insert(),remove(),clear()等) - 用新的
List数据重新创buildArrayAdapter。 (使用大量的资源和垃圾收集。) - 创build自己的派生自
BaseAdapter和ListAdapter,允许更改基础List数据结构。 - 每次更新列表时使用
notifyDataSetChanged()。 要在UI线程上调用它,请使用Activity的runOnUiThread()。 然后,notifyDataSetChanged()将工作。
你可以使用runOnUiThread()方法如下。 如果您不使用ListActivity ,只需调整代码以获取对ArrayAdapter的引用即可。
final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter()); runOnUiThread(new Runnable() { public void run() { adapter.notifyDataSetChanged(); } });
我最近写了关于这个主题,虽然这个post很旧,我认为这将有助于一些想要知道如何实施BaseAdapter.notifyDataSetChanged()一步一步正确的方式。
请按照如何在Android或更新的博客BaseAdapter.notifyDataSetChanged()中 正确实现 BaseAdapter.notifyDataSetChanged() 。
我有同样的问题,我不想用一个新的实例连续replace整个ArrayAdapter。 因此,我有AdapterHelper在其他地方做繁重的工作。
添加这个你通常会(尝试)呼叫通知
new AdapterHelper().update((ArrayAdapter)adapter, new ArrayList<Object>(yourArrayList)); adapter.notifyDataSetChanged();
AdapterHelper类
public class AdapterHelper { @SuppressWarnings({ "rawtypes", "unchecked" }) public void update(ArrayAdapter arrayAdapter, ArrayList<Object> listOfObject){ arrayAdapter.clear(); for (Object object : listOfObject){ arrayAdapter.add(object); } } }
我知道这是一个迟到的回应,但我正面临类似的问题,我设法解决它在适当的地方使用notifyDataSetChanged() 。
所以我的情况如下。
我不得不在一个完全不同的活动中返回一个操作栏选项卡(片段)更新列表视图的内容。 然而,最初的列表视图不会反映任何变化。 但是,当我单击另一个选项卡,然后返回到所需的选项卡时,将使用其他活动的正确内容更新列表视图。 所以为了解决这个问题,我使用了必须返回数据的activity的代码中的notifyDataSetChanged() 。
这是我在活动中使用的代码片段。
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_new_forward: FragmentTab2.mListAdapter.notifyDataSetChanged();//this updates the adapter in my action bar tab Intent ina = new Intent(getApplicationContext(), MainActivity.class); ina.putExtra("stra", values1); startActivity(ina);// This is the code to start the parent activity of my action bar tab(fragment). } }
这个活动会返回一些数据到FragmentTab2 ,它会直接更新我在FragmentTab2列表视图。
希望有人认为这有用!