You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RecyclerView中动态修改ProgressBar指定ID Drawable颜色的问题

问题:RecyclerView中仅修改ProgressBar指定Drawable的颜色

在RecyclerView的onBindViewHolder方法中,需要修改ProgressBar里ID为circle_center的Drawable颜色,但直接调用getProgressDrawable().setColorFilter()会让整个ProgressBar变成黑色,无法单独修改目标Drawable。

用户提供的代码

XML布局(layer-list)

<item
    android:id="@+id/circle_center"
    android:gravity="center">
    <shape android:shape="oval">
        <size android:width="58dp"
            android:height="58dp"></size>
        <solid android:color="#E2D5D5"></solid>

    </shape>

</item>

<item>
    <shape android:shape="ring"
        android:thicknessRatio="8"
        android:useLevel="false">

        <solid android:color="@color/white"></solid>

    </shape>

</item>

<item>
    <shape android:shape="ring"
        android:thicknessRatio="8"
        android:useLevel="true">

        <solid android:color="#ffff00"></solid>

    </shape>
</item>

onBindViewHolder代码

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

        Nivels_of_Screen_Middle nivels = list.get(position).get(0);
        MyviewHolder Holder = (MyviewHolder)holder;

        Holder.progressBar.getProgressDrawable()
        .setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_ATOP);

        Holder.progressBar.setProgress(nivels.getProgressBar());

        Holder.textView.setText(nivels.getTextView());

        Holder.imageView.setImageResource(nivels.getImageView());
}

解决方案

直接调用getProgressDrawable().setColorFilter()会作用于整个LayerDrawable(即你的layer-list布局),导致所有层级的Drawable都被染色。要单独修改指定ID的子Drawable,需按以下步骤操作:

  1. 将ProgressBar的Drawable强制转换为LayerDrawable
  2. 通过findDrawableByLayerId()定位到ID为circle_center的子Drawable
  3. 仅给该子Drawable设置颜色滤镜,避免影响其他层级

修改后的onBindViewHolder代码:

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    Nivels_of_Screen_Middle nivels = list.get(position).get(0);
    MyviewHolder viewHolder = (MyviewHolder) holder;

    // 获取ProgressBar对应的LayerDrawable
    LayerDrawable layerDrawable = (LayerDrawable) viewHolder.progressBar.getProgressDrawable();
    if (layerDrawable != null) {
        // 找到目标子Drawable
        Drawable centerCircle = layerDrawable.findDrawableByLayerId(R.id.circle_center);
        if (centerCircle != null) {
            // 先清除之前的颜色滤镜,避免ViewHolder复用导致颜色错乱
            centerCircle.clearColorFilter();
            // 设置目标颜色滤镜
            centerCircle.setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_ATOP);
        }
    }

    viewHolder.progressBar.setProgress(nivels.getProgressBar());
    viewHolder.textView.setText(nivels.getTextView());
    viewHolder.imageView.setImageResource(nivels.getImageView());
}

注意事项

  • 确保ProgressBar的Drawable确实是上述layer-list布局,否则findDrawableByLayerId可能返回null
  • 每次绑定ViewHolder时清除之前的颜色滤镜,防止RecyclerView复用ViewHolder时出现颜色残留问题

内容的提问来源于stack exchange,提问作者Cristian Nascimento Maurício

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:22:32