Android:RecyclerView.Adapter无法正常工作

时间:2015-01-29 15:16:35

标签: android android-recyclerview android-cardview android-viewholder recycler-adapter

我的问题ID与@Richard直接相关,其中一个关于RecyclerView.Adapter中的onBindViewHolder()的方法未被调用,因为他(和我)期望它这样做。

我注意到这个方法被正确调用,直到我的数据集结束(9个CardViews,向下滚动),但是当我尝试返回(向上滚动)时,它不再被调用。真正的问题是,在那里我在数据集中进行了更改并调用了notifyDataSetChanged(),但是由于这种奇怪的(对我来说)行为,我的修改不应该发生。

我附上的图片想要澄清:

  • 我到了Rec.View的底部(cardView - 仰望:一切都很好);
  • 处理卡已经完全或部分显示没有问题(仰卧,Gerund和参与者);
  • 但当我到达第一个完全模糊的cardView时,onBindViewHolder()不再被调用,我可以从调试中看到链接到适配器的数据集是"仰视"一,这就是:显示仰光cardView。

Scrolling up from the bottom of the RecyclerView - Sorry for the quality

我认为理查德在他的问题中遇到了完全相同的问题,我尝试了他完全相同的解决方案:我在我的适配器构造函数中将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 是我在我的活动中实现的地图,用于设置我的数据集的唯一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。

2 个答案:

答案 0 :(得分:8)

当您setHasStableIds(true)时,您必须使用getItemId(int position)实施return position

您当前的一段代码setHasStableIds(true)只告诉您的适配器项目不会因给定位置而改变而且适配器无需再次为此位置调用onBindViewHolder

答案 1 :(得分:0)

我有同样的例外,但实际上是由不同的问题引起的。在尝试setHasStableIds(true)setLayoutTransition(null)后,每个人都没有运气,我意识到我正在将视图添加到onCreateViewHolder中的父级(我不应该这样做,因为适配器为你照顾这个)。我删除了,问题解决了。

@Override
public TopTrayIconAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    DMImageView icon = new DMImageView(mContext);
    LinearLayout.LayoutParams faceParams = new LinearLayout.LayoutParams(ICON_WIDTH, ICON_WIDTH);
    faceParams.gravity = Gravity.CENTER;
    faceParams.leftMargin = 15;
    faceParams.rightMargin = 15;

    parent.addView(icon, faceParams);  <- THIS WAS THE ISSUE