我最初有5个项目的recyclerview。现在我想要做的是在0,1,2,3和4位添加另外5个项目。所以我这样做:
//add another 5 items to my recyclerview
for(int i=0 , i < 5 , i++){
//add new item to the list at the specified position
my_list.add(i , "new item"+ String.valueOf(i));
//notify adapter
my_adapter.notifyItemInserted(i);
}
问题是调用(notifyItemInserted(i))会弄乱整个列表。但调用notifyAdapterDataSetChanged()并不会搞砸任何东西。
我想避免调用notifyAdapterDataSetChanged()。
为什么会这样?
感谢。
修改
我会更新问题,以便其他人了解问题:
我最初在0,1,2,3,4位置有5个项目,现在我想在0,1,2,3,4的前5个项目中添加5个新项目(我想要新的项目到取代之前的那些)如何正确通知适配器?
答案 0 :(得分:0)
首先,我欣赏:)你使用方法
notifyItemInsert()
因为 它会给你一些插入动画而不需要任何努力 在通知时,永远不要挂断您的视图甚至列表中的数百个项目。我见过很多开发人员使用的notifyDataSetChange适用于小型列表。但是如果你的api不支持分页并且你有数百个列表,那么在设置适配器时你的视图会停留一段时间。
如果您想更改现有项目。
for(int i=0 , i < 5 , i++){
my_list.set(i , "new item"+ String.valueOf(i));
}
my_adapter.notifyItemRangeChanged(0, 5);
您也可以使用notifyItemChanged(list.size() - 1);
,如下所示。
如果您想要插入新内容
for (int i = 0; i < 5; i++) {
list.add("new item" + String.valueOf(i));
notifyItemInserted(list.size() - 1);
}
现在明白了 - 首先你不知道列表中已有多少项,所以不要使用my_list.add(i , "new item"+ String.valueOf(i));
,因为这将取代旧项目,第二次使用notifyItemInserted(list.size() - 1);
,它会自动检查已插入的项目
你也可以像Hed一样使用notifyItemRangeInserted。这也是正确的
更新:你可以这样做。首先在现有列表中添加5个项目列表。然后将最终列表设置为适配器。
ArrayList arrayList5Items;
ArrayList arrayList = my_adapter.getList();
arrayList5Items.addAll(arrayList);
my_list = arrayList5Items;
my_adapter.notifyItemRangeInserted(0, 5);