recyclerview:通知项目插入了整个列表

时间:2018-04-15 07:57:27

标签: android android-recyclerview notifydatasetchanged

我最初有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个新项目(我想要新的项目到取代之前的那些)如何正确通知适配器?

1 个答案:

答案 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);