RecyclerView不断重复缓存(?)子视图,而不是查看onBindViewHolder

时间:2015-02-15 22:25:41

标签: android android-recyclerview

我有RecyclerView,其中每个列表项都有一个ImageButton,我在适配器的onBindViewHolder()中定义了它的图像:

    int myVote = getMyVote();
    if (myVote != 0) {
        Log.d("dbg", myVote + "");
        holder.ratingButton.setImageResource(R.drawable.ic_star_grey600_36dp);
    }

所以ratingButton是列表项布局右下角的一颗星。如果满足条件(myVote!= 0),它的形状将填充灰色(因此,按下日志记录)。

问题在于,当我向下滚动列表时,即使我可以在日志窗口中看到唯一的一条记录(对于正确的列表项),我也能看到其他星星被填满。此外,这个带有错误更改按钮的列表项每5行重复一次,这让我很困惑。如果我改变

mListView.setItemViewCacheSize(0);
,重复周期变为3,那么我们可以假设它与RecyclerView的缓存和回收机制有某种联系。

请帮我解决问题。谢谢!

3 个答案:

答案 0 :(得分:9)

别忘了实施

public long getItemId(int position) {}

否则,您将在 RecyclerView 中看到重复的项目。

答案 1 :(得分:5)

尝试将您的代码更改为:

if (myVote != 0) {
        Log.d("dbg", myVote + "");
        holder.ratingButton.setImageResource(R.drawable.ic_star_grey600_36dp);
    } else {
        holder.ratingButton.setImageResource(int another resource);
    }
}

答案 2 :(得分:2)

您可能还必须使用else编写some another resource部分主要条件,如:

if (myVote != 0) {
    Log.d("dbg", myVote + "");
    holder.ratingButton.setImageResource(R.drawable.ic_star_grey600_36dp);
} else {
    holder.ratingButton.setImageResource(int another_resource);
}

这对我有用。