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

标签 android android-recyclerview shapes layer-list gradientdrawable

我正在创建一个带有 RecyclerView 的列表。 每个列表项都是来自用户的帖子(现在是硬编码的)。 每个帖子的背景都是从 drawable 文件夹中的 layer-list XML 文件加载的。

一切都按预期与文本等一起工作,但我正在尝试以编程方式更改背景颜色。它改变了每个项目的背景颜色,除了第一个项目,我不明白为什么。

第一个项目总是获得由 itemshapesolid 颜色指定的背景颜色,称为 shape_background 在 XML 文件中,所以它没有改变,但以下项目获得颜色 #ff22ff

这是适配器的实现:

class PostListAdapter extends RecyclerView.Adapter<PostListAdapter.PostViewHolder>{

    private LayoutInflater inflater;
    private List<PostRow> data = Collections.emptyList();

    PostListAdapter(Context context, List<PostRow> data) {
        inflater = LayoutInflater.from(context);
        this.data = data;
    }

    @Override
    public void onBindViewHolder(PostViewHolder holder, int position) {

        PostRow current = data.get(position);
        holder.text.setText(current.text.toUpperCase());
        holder.time.setText(current.time.toUpperCase());
        holder.answers.setText(current.answers.toUpperCase());

        try {
            // "#ff22ff" will be changed to current.color, unique color for every post
            // That string is parsed from a JSON request, hence the try-catch.
            int color = Color.parseColor("#ff22ff"); 
            holder.shape.setColor(color);
        } catch (Exception e){
            e.printStackTrace();
        }

    }

    @Override
    public PostViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.post_row, parent, false);
        return new PostViewHolder(view);
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    class PostViewHolder extends RecyclerView.ViewHolder {

        TextView text;
        TextView time;
        TextView answers;
        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);
            LayerDrawable layers = (LayerDrawable) ContextCompat.getDrawable(itemView.getContext(), R.drawable.bubble);

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

    }

}

为什么第一项的背景没变,文字变了?

提前致谢!

最佳答案

在您的 onBindViewHolder 上,获取您的 View (来自 holder),因为您需要更改背景颜色并获取其当前背景(可绘制的气泡,您已经在 XML 属性中设置)

LayerDrawable layerDrawable = (LayerDrawable) yourView.getBackground().getCurrent();
GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id. shape_background).getCurrent();
// set you color based on position
gradientDrawable.setColor(Color.parseColor("#ff22ff"));

关于Android RecyclerView 不以编程方式更改第一项的背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41371986/

相关文章:

android - 如何显示从状态栏通知开始的权限 Activity ?

android - 在 Android Chrome 浏览器的移动 Web 应用程序菜单中未检测到 HTML unicode ☰

android - Kotlin、Android - Viewpager 父级的位置(这是一个 RecyclerView)- 单击

python - 如何将 RGB 图像数据集转换为单 channel 灰度?

python - 如何使用 pygame 绘制 3D 形状(没有其他模块)

android - 解析 xml 文件时出错

android - Xamarin Android 模拟器无法在 Visual Studio 2013 Ultimate 中完成启动

android - RecyclerView如何循环

android - RecyclerView android 上的 notifyDataSetChanged

android - Android map 应用程序中形状(圆形、多边形)的信息窗口