我正在尝试在我的Android Application
notifyDataSetChanged()
方法中使用ArrayAdapter
,但这对我不起作用。
我发现as answer here,notifyDataSetChanged()
应该在主线程中运行,但没有示例。
有人可以发送示例或至少发送链接吗?!
答案 0 :(得分:315)
对于ArrayAdapter
,notifyDataSetChanged
仅在适配器上使用add()
,insert()
,remove()
和clear()
时才有效。
构建ArrayAdapter
时,它会保留传入的List
的引用。如果您要传入属于Activity的成员List
,稍后更改该活动成员时,ArrayAdapter
仍然保留对原始List
的引用。适配器不知道您更改了活动中的List
。
您的选择是:
ArrayAdapter
的功能修改基础列表(add()
,insert()
,remove()
,clear()
等。)ArrayAdapter
数据重新创建List
。 (使用大量资源和垃圾收集。)BaseAdapter
和ListAdapter
,允许更改基础List
数据结构。notifyDataSetChanged()
。要在UI-Thread上调用它,请使用runOnUiThread()
的{{1}}。
然后,Activity
将有效。答案 1 :(得分:30)
您可以使用runOnUiThread()
方法,如下所示。如果您没有使用ListActivity
,只需调整代码即可获得对ArrayAdapter
的引用。
final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
public void run() {
adapter.notifyDataSetChanged();
}
});
答案 2 :(得分:11)
我最近写过这个主题,虽然这篇文章很老,但我认为对于想要知道如何以正确的方式逐步实施BaseAdapter.notifyDataSetChanged()
的人会有所帮助。
请关注How to correctly implement BaseAdapter.notifyDataSetChanged() in Android或the newer blog BaseAdapter.notifyDataSetChanged()。
答案 3 :(得分:6)
我遇到了同样的问题,我不想连续用新的实例替换整个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);
}
}
}
答案 4 :(得分:2)
我知道这是一个迟到的回复,但我遇到了类似的问题,我设法通过在正确的位置使用notifyDataSetChanged()
来解决它。
所以我的情况如下。
我必须使用完全不同的活动返回的内容更新操作栏标签(片段)中的列表视图。但是,最初,列表视图不会反映任何更改。但是,当我单击另一个选项卡然后返回到所需选项卡时,列表视图将使用其他活动中的正确内容进行更新。所以为了解决这个问题,我在必须返回数据的活动代码中使用了操作栏适配器的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
更新我的列表视图。
希望有人觉得这很有用!