RecyclerView使用错误的值

时间:2016-02-20 11:06:01

标签: android

因此,我使用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会改变视图的颜色?

1 个答案:

答案 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定义的后备布局背景颜色创建一个样本