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

Android RecyclerView不断重复缓存的(?)子视图,而不查看onBindViewHolder,android,android-recyclerview,Android,Android Recyclerview,我有一个RecyclerView,其中每个列表项都有一个ImageButton,我在适配器的onBindViewHolder()中定义了它的图像: 因此,ratingButton在列表项布局的右下角是一个星形。如果满足条件(myVote!=0),则其形状将填充灰色(并相应地推送日志记录) 问题是,当我向下滚动列表时,我可以看到其他星星被填满,即使我在日志窗口中只能看到一条记录(对于正确的列表项)。此外,此列表中按钮更改不正确的项目每5行重复一次,这让我感到困惑。如果我更改mListView.se

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

因此,ratingButton在列表项布局的右下角是一个星形。如果满足条件(myVote!=0),则其形状将填充灰色(并相应地推送日志记录)

问题是,当我向下滚动列表时,我可以看到其他星星被填满,即使我在日志窗口中只能看到一条记录(对于正确的列表项)。此外,此列表中按钮更改不正确的项目每5行重复一次,这让我感到困惑。如果我更改mListView.setItemViewCacheSize(0);重复周期更改为3,因此我们可以假设它与RecyclerView的缓存和回收机制有某种联系

mListView.setItemViewCacheSize(0);
请帮我解决这个问题。谢谢

尝试将代码更改为:

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

别忘了实施

public long getItemId(int position) {}

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

您可能还必须使用
其他资源编写
主要条件的一部分,如:

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

它对我有效。

您正在显示测试的
if
myVote!=0
。请粘贴到
else
块中,在该块中调用
setImageResource()
获取其他值。而且,如果您没有这样的
else
块,那将是您的问题。按照建议的方式实现getItemId()和getItemViewType(),getItemId实现对于这个问题似乎没有用处
if (myVote != 0) {
    Log.d("dbg", myVote + "");
    holder.ratingButton.setImageResource(R.drawable.ic_star_grey600_36dp);
} else {
    holder.ratingButton.setImageResource(int another_resource);
}