Android 为RecyclerView中TextView设置随机颜色不显示问题咨询
问题原因及对应解决方案
- 场景1:混淆了文字颜色和背景色设置
如果你要修改的是TextView的文字颜色,你当前调用的setBackgroundColor()修改的是控件背景,改为调用setTextColor(currentStrokeColor)即可生效。 - 场景2:RecyclerView item复用导致颜色错乱/不显示
若你只在item创建时执行颜色赋值逻辑,滚动时复用的旧item会保留之前的颜色配置,必须在onBindViewHolder生命周期中每次绑定数据时都重新执行颜色生成和赋值逻辑,示例代码:@Override public void onBindViewHolder(MovieVH movieVH, int position) { // 其他数据绑定逻辑 Random rnd = new Random(); int currentStrokeColor = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)); // 设置背景色用这行 movieVH.initial.setBackgroundColor(currentStrokeColor); // 设置文字颜色用下面这行 // movieVH.initial.setTextColor(currentStrokeColor); } - 场景3:布局属性覆盖了动态设置的颜色
检查对应TextView的XML布局,是否设置了background、foreground属性或者点击selector,这些预置资源会覆盖代码动态设置的颜色,移除对应属性即可。 - 优化建议:减少Random实例重复创建
可以把Random实例提取为Adapter的全局成员变量,降低不必要的对象创建开销:public class MovieAdapter extends RecyclerView.Adapter<MovieVH> { private Random mRnd = new Random(); @Override public void onBindViewHolder(MovieVH movieVH, int position) { int currentStrokeColor = Color.argb(255, mRnd.nextInt(256), mRnd.nextInt(256), mRnd.nextInt(256)); movieVH.initial.setBackgroundColor(currentStrokeColor); } } - 固定item颜色的补充方案
如果不希望每次滚动RecyclerView时item颜色都重新随机生成,可以在初始化数据源时就为每个条目生成对应的颜色值存入数据类,绑定的时候直接取出对应位置的颜色赋值即可,不会出现滚动变色问题。
内容的提问来源于stack exchange,提问作者Vishali
相关产品推荐
相关产品推荐

