错误:adapter.notifyDataSetChanged();
不起作用,注意: (转载)RecyclerView跟ListView不一样,当我们想要更新数据的时候,有两种情况:
1、dataset为List<T>,也通常是这样:
- dataList = createDataList(5); //这是错误的做法,dataList为初始传入的List
- dataList.addAll(createDataList(5)); //这是正确的做法
我们想要更新数据的时候,请记住这句话“whenever adding or removing elements, always make changes to the existing list”,也就是说,请在原数据集上更新你的数据,而不是用一个新的数据集替代,记得最后要 mAdapter.notifyDataSetChanged()一下哟。
结论: 改变数据源的时候,一定要改变adapter真正的数据源:
两种情形:
1. 如果adapter中是如下情形
public ItemAdapter(ArrayList<Item> array, Context context) {
this.array = new ArrayList<Item>(array);
this.context = context;
}
则:在activity中改变数据源无效的,因为adapter的数据源是自己新建的,而不是引用(指向)activity中的。
应该使用:public void update(ArrayList<Item> arrayAux) { array.clear(); array.addAll(arrayAux); this.notifyDataSetChanged(); }此时用notifyDataSetChanged()是无效的!!把activity 的list,加到adapter所引用的数据源上,才真正起作用!!!第二种情形:如果adapter中是如下情形:
public ItemAdapter(ArrayList<Item> array, Context context) {
this.array = array; this.context = context; }
这是直接引用的activity中的list,这样的话,adapter的数据源就是引用的activity里面的,改动activity中的数据源,会直接影响到adapter!!
直接使用notifyDataSetChanged()即可生效!!
总结: 要想改变RecyclerView的数据集,必须要改变adapter对象所引用的那个集合,然后notifyDataSetChanged()! 否则无效!adapter只认自己的原始数据集。