Recyclerview.notifyItemInserted()复制列表项

时间:2017-04-27 08:45:04

标签: android android-recyclerview

我有一个要求,我应该在滚动和下载列表的同时下载广告项目。自从调用notifyDatasetChnaged()后,重置所有内容,我正在调用notifyItemInserted(position)。但是,调用它会复制列表中的项目。我发现列表中没有重复的项目。但在调用notifyItemInserted后,它会复制该项目。我没有得到如何解决这个问题。这就是我正在做的事情:

mNewsList.add(mPreviousAdPosition, newsItem);
mAdapter.notifyItemInserted(mPreviousAdPosition);

如果我打电话,它运作正常,没有重复的项目。但我不希望我的列表项重新创建。可能是什么问题?

5 个答案:

答案 0 :(得分:2)

对于完全相同的用例,我遇到了同样的问题,解决方案是:

在适配器中实现此方法:

@Override
public long getItemId(int position) {
    //Return the stable ID for the item at position
    return items.get(position).getId();
}

在适配器的构造函数中调用此方法:

//Indicates whether each item in the data set can be represented with a unique identifier
setHasStableIds(true);

答案 1 :(得分:1)

您可以在数组末尾添加对象,每个对象都有一个位置,并且需要在回收器视图中显示它。在调用notifyItemInserted(position)之前,根据位置对此数组进行排序。通过这种方式,只会绘制所需的数据。我已经接受了这种方法,并且非常适用于在回收站视图中添加的动态部分。

答案 2 :(得分:0)

您的代码应该是这样写的:

addData

然后你需要调用有趣的Value ID Object 100 ABD Type1 200 ABD Type1 400 ABD Type2 200 BCE Type1 100 BCE Type1 800 JHO Type3 600 TVM Type4

答案 3 :(得分:0)

创建临时列表并添加如下所述的项目:

List<YourModel> mTmpList = new ArrayList<YourMdel>();

//add items (from 0 -> mPreviousAdPosition) to mTmpList;
for(int i=0; i<mPreviousAdPosition; i++) {
    mTmpList.add(mNewsList.get(i));
}

//add item at mPreviousAdPosition
mTmpList.add(newsItem);

//add remaining items and set i<=mNewsList.size() because we ha
for(int i=mPreviousAdPosition; i<=mNewsList.size(); i++) {
    mTmpList.add(mNewsList.get(i - 1)); //because we have added item at mPreviousAdPosition;
}

mNewsList = mTmpList;
mAdapter.notifyDataSetChanged();

答案 4 :(得分:-1)

您应该在列表末尾添加该项目。

mNewsList.add(newsItem);

然后像这样通知。

mAdapter.notifyItemInserted(mNewsList.size()-1);