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,需按以下步骤操作:
- 将ProgressBar的Drawable强制转换为
LayerDrawable - 通过
findDrawableByLayerId()定位到ID为circle_center的子Drawable - 仅给该子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
相关产品推荐
相关产品推荐

