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
列表视图。
希望有人认为这有用!