我有一个要求,我应该在滚动和下载列表的同时下载广告项目。自从调用notifyDatasetChnaged()
后,重置所有内容,我正在调用notifyItemInserted(position)
。但是,调用它会复制列表中的项目。我发现列表中没有重复的项目。但在调用notifyItemInserted
后,它会复制该项目。我没有得到如何解决这个问题。这就是我正在做的事情:
mNewsList.add(mPreviousAdPosition, newsItem);
mAdapter.notifyItemInserted(mPreviousAdPosition);
如果我打电话,它运作正常,没有重复的项目。但我不希望我的列表项重新创建。可能是什么问题?
答案 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);