Android RecyclerView不会以编程方式更改第一个项目的背景颜色

时间:2016-12-29 01:22:22

标签: android android-recyclerview shape layer-list gradientdrawable

我正在创建一个$child['points'] = $total; $temp[] = $child; 的列表。 每个列表项都是来自用户的帖子(现在是硬编码的)。 每个帖子的背景都是从drawable文件夹中的RecyclerView XML文件加载的。

所有内容都与文本等一起正常工作但我正在尝试以编程方式更改背景颜色。它改变了每个项目的背景颜色,第一项的除了,我无法弄清楚原因。

第一项始终获取由XML文件中名为layer-list的{​​{1}}内solid的{​​{1}}颜色指定的背景颜色,因此不会更改,但以下项目的颜色为shape

这是适配器的实现:

item

为什么第一个项目的背景没有改变,但文本是?

提前谢谢!

3 个答案:

答案 0 :(得分:3)

SHOW INDEX FROM <table_name> WHERE Key_name = 'PRIMARY'; 上,获取您的观点(来自持有人),因为您需要更改背景颜色&amp;获取当前背景(可绘制的气泡,已在XML属性中设置)

SHOW KEYS FROM <table_name> WHERE Key_name = 'PRIMARY';

答案 1 :(得分:3)

你已拨打$(function () { $(".icon").on('click', function (event) { var id = $(this).attr("id"); console.log(id); }); });

但是holderView没有刷新。

也许你应该打电话给

holder.shape.setColor(color);

刷新holderView

答案 2 :(得分:2)

这里有两个不同的问题。

首先 - 您更改drawable本身但不查看背景。它由liubaoyua和Vignesh Sundar解决。

第二 - 你静态改变R.drawable.bubble。即使在突变之后,Android也可以缓存并重用它。当您开始为不同的项目使用不同的颜色时,它可能会导致另一个问题。

要解决第二个问题,您必须在每次首次变异之前调用android.graphics.drawable.Drawable#mutate

  

默认情况下,从同一资源加载的所有drawables实例共享一个公共状态;如果修改一个实例的状态,则所有其他实例将收到相同的修改。

所以看起来应该是这样的:

class PostViewHolder extends RecyclerView.ViewHolder {

    TextView text;
    TextView time;
    TextView answers;
    LayerDrawable layers;
    GradientDrawable shape;

    PostViewHolder(View itemView) {
        super(itemView);

        text = (TextView) itemView.findViewById(R.id.text);
        time = (TextView) itemView.findViewById(R.id.time);
        answers = (TextView) itemView.findViewById(R.id.answers);

        layers = (LayerDrawable) ContextCompat
                .getDrawable(itemView.getContext(), R.drawable.bubble)
                .mutate();

        shape = (GradientDrawable) layers.findDrawableByLayerId(R.id.shape_background);
        itemView.setBackground(layers);
    }

    void setColor(Color color) {
        shape.setColor(color);
        itemView.setBackgroundDrawable(layers);
    }
}

通过将.mutate()从图层移动到形状,可以稍微简化一下。