我的问题与@Richard的问题直接相关,他和我希望RecyclerView.Adapter中的onBindViewHolder()方法能像他们预期的那样被调用。
我发现在我的数据集(9个CardViews,向下滚动)到达末尾时,该方法被正确调用,但是当我尝试向上滚动回到顶部时,它不再被调用。实际的问题是,我在这里对数据集进行更改并调用notifyDataSetChanged(),但由于这种奇怪的行为(对我来说),我的修改没有在应该发生的时候生效。
我附加的图片想要说明:
- 我到达了Rec.View的底部(cardView - Supine:一切正常);
- 处理完全或部分显示的卡片没有问题(Supine,Gerund和Participle);
- 但是当我到达完全被遮挡的第一张卡片视图时,onBindViewHolder()不再被调用,我可以从调试中看到与适配器链接的数据集是“Supine”,这里是:Supine cardView已显示出来。
我认为这正是Richard在他的问题中面对的确切问题,因此我尝试了他完全相同的解决方案:我在Adapter的构造函数中强制将setHasStableIds()设置为true,
public CardAdapter(List<Object> items){
this.items = items;
adapterList = new ArrayList<String>();
formAdapt = new ConjFormAdapter(adapterList);
itemMap = new HashMap<Object, Long>();
setHasStableIds(true);
}
这里的itemMap是我在活动中实现的一个Map,用于设置数据集的唯一ID。
我通过以下方式重写了getItemId()方法:
public long getItemId(int position) {
Object item = items.get(position);
return itemMap.get(item);
}
但是从图片中可以看到,我仍然得到了这个结果:有什么想法,请?
编辑
在我的活动中实现itemMap:
for(int i=0, j=0; i<conj_items.size(); i++, j++)
conjAdapter.getItemMap().put(conj_items.get(i), (long) j);
这里的conj_items是我传递给适配器的ArrayList。