Answers:
对于ArrayAdapter
,notifyDataSetChanged
只有当你使用的作品add()
,insert()
,remove()
,和clear()
在适配器。
当一个ArrayAdapter
构造,它保存了参考List
中传递。如果你是在一个传递List
,这是一个活动中的一员,并更改活动成员后,ArrayAdapter
仍持原来的一个参考List
。适配器不知道您List
在“活动” 中进行了更改。
您的选择是:
ArrayAdapter
修改底层列表(add()
,insert()
,remove()
,clear()
,等等)ArrayAdapter
用新List
数据重新创建。(使用大量资源和垃圾回收。)BaseAdapter
和ListAdapter
允许潜在的改变List
数据结构。notifyDataSetChanged()
每次更新列表时使用。要调用它的UI线程,使用runOnUiThread()
的Activity
。然后,notifyDataSetChanged()
将工作。notifyDataSetChanged()
以这种方式:((BaseAdapter) arrayAdapter).notifyDataSetChanged();
?
您可以使用以下runOnUiThread()
方法。如果您没有使用ListActivity
,只需修改代码以获取对您的的引用ArrayAdapter
。
final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
public void run() {
adapter.notifyDataSetChanged();
}
});
我最近写了关于这个主题的文章,尽管这篇文章过时了,但我认为这对希望了解如何BaseAdapter.notifyDataSetChanged()
逐步正确地实施的人会有所帮助。
请遵循如何在Android或较新的博客BaseAdapter.notifyDataSetChanged()中正确实现BaseAdapter.notifyDataSetChanged()的方法。
mItem.add()
,我只是编辑了一个元素,这mItem.get(position).setImage(encodedImage)
可能就是为什么这给了NullPointer exeption错误。所以notifyDataSetChange只是在编辑它,在上面提到的Array适配器的bcz是这样工作的仅用于add(),clear(),remove()等
我遇到了同样的问题,我不希望用新实例连续替换整个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);
}
}
}
super.addAll(..)
用于API> 11和super.add(..)。 )与类似您的迭代的组合:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { super.addAll(items); } else { for (Object o : collection) { super.add(o); } }
。现在,从新的适配器类扩展。
我知道这是一个较晚的答复,但我遇到了类似的问题,因此设法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
并将直接更新中的listview FragmentTab2
。
希望有人觉得这有用!