因此,我使用RecyclerView来显示网格。在其适配器的onBindViewHolder方法中,我更新了视图内容。我将更新的一部分放入另一个线程以保持UI活着。
@Override
public void onBindViewHolder (final MovieHolder holder, final int position) {
// Blah, blah. Set movie details. Everything is fine.
// Generate a palette or load from the memory and adjust the background color of the view.
new Thread(new Runnable() {
@Override
public void run () {
Palette palette = getPalette();
final Palette.Swatch bestSwatch = findBestSwatch(palette)
if (bestSwatch != null) {
activity.runOnUiThread(new Runnable(
@Override
public void run() {
holder.layout.setBackgroundColor(bestSwatch.getRgb());
}
));
}
}
}).start();
}
除非没有找到bestSwatch,否则效果很好。然后它第一次显示正确的背景颜色,当我向下和向后滚动时,它将从其中一个视图中获得随机颜色。
为什么在我不更新时,RecyclerView会改变视图的颜色?
答案 0 :(得分:1)
RecyclerView
重用其行ViewHolder
,因此得名。所以你的问题是,循环视图具有在另一个近期位置设置的背景颜色。
对此的解决方案很简单......
Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
Palette.Swatch swatch = palette.getDarkVibrantSwatch();
if (swatch == null)
swatch = new Palette.Swatch(ContextCompat.getColor(context, R.color.fallback_background), 4);
holder.layout.setBackgroundColor(swatch.getRgb());
}
});
因此,您始终设置BackgroundColor。如果没有生成样本,则使用您在colors.xml
定义的后备布局背景颜色创建一个样本