我正在尝试在我的 Android 应用程序
中使用 ArrayAdapter
的 notifyDataSetChanged()
方法,但它对我不起作用。
我在这里找到了 答案,说应该在主线程中运行 notifyDataSetChanged()
,但没有示例。
有人可以发送一个示例或至少一个链接吗?!
我正在尝试在我的 Android 应用程序
中使用 ArrayAdapter
的 notifyDataSetChanged()
方法,但它对我不起作用。
我在这里找到了 答案,说应该在主线程中运行 notifyDataSetChanged()
,但没有示例。
有人可以发送一个示例或至少一个链接吗?!
对于一个ArrayAdapter
,只有在使用适配器的add()
、insert()
、remove()
和clear()
方法时,notifyDataSetChanged
才有效。
当构造一个ArrayAdapter
时,它会持有传入的List
的引用。如果你传入的List
是Activity的成员,并且稍后更改该Activity成员,则ArrayAdapter
仍然持有对原始List
的引用。适配器不知道你在Activity中更改了列表。
以下是您的选择:
ArrayAdapter
的函数来修改底层List (add()
, insert()
, remove()
, clear()
等)List
数据重新创建ArrayAdapter
。(会消耗大量资源并进行垃圾回收。)BaseAdapter
和ListAdapter
派生出来,允许更改底层List
数据结构。notifyDataSetChanged()
。要在UI线程上调用它,请使用Activity
的runOnUiThread()
。然后,notifyDataSetChanged()
就会起作用。notifyDataSetChanged()
时,将检查在适配器中声明的数组。因此,你应该在适配器中创建一个公共方法,如updateArrayList
,它将修改已声明的数组。记得使用ArrayList
方法,如add()
、insert()
、remove()
或clear()
来更新项目。
还要记得更新在RecyclerView的适配器中使用的数组大小。该参数用于确定RecyclerView的行数。 - Alston您可以按照以下方式使用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)
。可能这就是为什么它会出现空指针异常的原因。那么,notifyDataSetChange是否只适用于编辑呢?因为对于数组适配器,上面提到它仅适用于add()、clear()、remove()等操作。 - Shreekant N我曾遇到相同的问题,但是我不想一直用新实例替换整个ArrayAdapter。因此,我让 AdapterHelper 在其他地方做更重的工作。
在通常(尝试)调用notify的位置添加以下内容
new AdapterHelper().update((ArrayAdapter)adapter, new ArrayList<Object>(yourArrayList));
adapter.notifyDataSetChanged();
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); } }
。现在只需从新的适配器类进行扩展即可。 - Konsumierer我知道这是一个晚回复,但是我遇到了类似的问题,并通过在正确位置使用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
中更新我的列表视图。
希望有用!
在 RecyclerView 中,有多个通知器会在不同的事件中被调用。
notifyDataSetChanged()
。如果您在 arrayList 中逐个插入数据,则不需要执行 notifyDataSetChanged()
,因为每当您调用 notifyDataSetChanged()
时,它都会调用 onBindViewHolder()
和 your arrayList size
相同的次数。那不是我的场景下的好习惯。因此,因此,当您需要逐个插入项目时,始终需要使用 yourAdapter.notifyItemInserted(position : Int)
并提供您已插入数据的参数。
通常,您需要将 notifyItemInserted(list.size)
作为位置传递,因为您总是在 arrayList 的末尾插入数据。
notifyItemRemoved(position:Int)
方法通知适配器更新列表并删除此位置的项目。notifyItemChanged()
通知适配器,并提供一个参数,即您已更新的位置。