先看问题代码:

if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {if (background == null && bkcolor == -1) {Drawable drawable = viewHolder.itemView.getBackground();if (drawable == null) {bkcolor = 0;} else {background = drawable;}}LogUtil.d("viewHolder",((MarketingEventRecyclerAdapter.MyViewHolder )viewHolder).mTvItemMarketingEventTitle.getText().toString());((MarketingEventRecyclerAdapter.MyViewHolder) viewHolder).mTvItemMarketingEventTitle.setText(((MarketingEventRecyclerAdapter.MyViewHolder) viewHolder).mTvItemMarketingEventTitle.getText()+"-");viewHolder.itemView.setBackgroundColor(Color.RED);//看这句}

问题重现:
先点击标题为0的:


第一个item被选中,同时我在标题中加了一个横线

再点击标题为3的:


第三个item被选中

再次点击标题为0的:

标题为0的和标题为3的同时变成红色了

控制台打印的log:
09-18 07:55:29.832 11934-11934/com.wecool.card D/viewHolder: 0
09-18 07:56:33.695 11934-11934/com.wecool.card D/viewHolder: 3
09-18 07:58:17.490 11934-11934/com.wecool.card D/viewHolder: 0-

下面我们看setBackgroundColor方法的源码:

@RemotableViewMethodpublic void setBackgroundColor(@ColorInt int color) {if (mBackground instanceof ColorDrawable) {((ColorDrawable) mBackground.mutate()).setColor(color);computeOpaqueFlags();mBackgroundResource = 0;} else {setBackground(new ColorDrawable(color));}}

其中调用了mutate()方法,mutate()方法是这样描述的:
Make this drawable mutable. This operation cannot be reversed. A mutable drawable is guaranteed to not share its state with any other drawable. This is especially useful when you need to modify properties of drawables loaded from resources. By default, all drawables instances loaded from the same resource share a common state; if you modify the state of one instance, all the other instances will receive the same modification. Calling this method on a mutable Drawable will have no effect.

翻译:
使这个drawable变得可变。 此操作无法反转。 一个可变的drawable保证不与任何其他drawable共享其状态。 当您需要修改从资源加载的drawable属性时,这是非常有用的。 默认情况下,从同一资源加载的所有drawable实例共享一个共同的状态; 如果您修改一个实例的状态,则所有其他实例都将收到相同的修改。 在可变的Drawable上调用此方法将不起作用。

也就是说item的背景Drawable会被复用

那么我们将代码改成

viewHolder.itemView.setBackground(new ColorDrawable(Color.Red));

问题便解决了

关于安卓setBackgroundColor中Drawable复用导致背景重复改变相关推荐

  1. corners边框_安卓中设置(shape)圆角背景和边框(stroke)相关的问题

    最近开发的项目中使用的圆角背景和边框比较多,基本都是使用shape文件和.9图片实现的.但在实现的过程中也是会出现一些小问题,这篇随笔会总结下来其中遇到的问题. 一,圆角大小不一致 1,四周圆角都为1 ...

  2. android配置so支持armeabi,安卓项目中so库选择(ndk abiFilters设置,armeabi,armeabi-v7a,arm64-v8a)...

    背景 Android 系统本质是一个通过改造的 Linux 系统,so库是Linux系统上使用的共享库(相似windows上的dll).最先,Android 系统只支持 ARMv5 的 CPU 构架, ...

  3. 前端开发中如何将文件夹中的图片变为背景图_如何用Elementor设计banner

    Banner也可以称之为海报,一般出现在网页的顶部.因为前端设计采用的是Html语言,而Html语言采用的是从上往下依次展示内容的方式,所以Banner的内容往往是一个网站首先呈现给网站访客的内容.如 ...

  4. android 视频背景图片,安卓手机怎么给视频添加背景图片 上下图片中间视频画面的小视频制作...

    狸窝是帮助用户解决问题 提供教程解决方案 在这个过程中有使用我们自己开发的软件 也有网上找的工具 只要帮助用户解决问题就好!同意则往下继续了解学习 ... 注意此教程方案是:『安卓手机端教程方案』.很 ...

  5. 在安卓项目中使用gifsicle编辑GIF动图-Android NDK 编译 gifsicle 为可执行文件记录

    一.前言 最近项目中有需要压缩GIF的需求,最开始时试图使用FFmpeg通过降低GIF的分辨率和帧率的来减少GIF文件体积,但实际测试下来,大多数情况下压缩效果并不理想,甚至会出现降低分辨率后导出的G ...

  6. android 模拟摄像头,在安卓模拟器中使用 VCam

    Win7 及以上系统建议使用最新的 WeCam 软件,和 VCam 类似,但对模拟器的支持更加灵活! VCam 虚拟摄像头可以用在安卓模拟器中,从而可以在各种安卓应用中使用"手机虚拟摄像头& ...

  7. ThreadLocal使用时因线程复用导致数据混乱分析

    ThreadLocal使用时因线程复用导致数据混乱分析 本文主要阐述使用ThreadLocal遇到数据混乱情况下的具体分析和解决过程 ThreadLocal原理 网上有很多介绍,不做详细介绍主要有四个 ...

  8. html2canvas生成长图片时导致背景图渲染不全问题

    文章目录 1.问题 2.解决 3.问题猜测 1.问题 在移动端中使用html2canvas生成图片时,因为数据较多,导致生成的图片很长,图片后边一小段中设置的html背景图直接没有显示出来. 2.解决 ...

  9. 安卓开发中ToggleButton按钮的使用

    ToggleButton(开关按钮)是Android系统中比较简单的一个组件,是一个具有选中和未选择状态双状态的按钮,并且需要为不同的状态设置不同的显示文本.下面以一个简单的控制室内设备的开关为例来介 ...

最新文章

  1. JAVA的instanceOf什么时候用
  2. 值得FS去的英雄副本
  3. 字节跳动副总裁杨震原:A/B测试不是万能的,但不会一定不行
  4. Win或Linux系统下用conda安装Open Babel
  5. 微信小程序 提示Toast
  6. 极其实用的sql脚本【建议收藏】
  7. vs.net打包生成可执行文件的方法
  8. rfcv函数实现_OpenSSL AES_ctr128_encrypt()作为伪随机函数在RFC3711(SRTP)
  9. SetWinEventHook和SetWindowsHookEx的异同[转]
  10. Django 后台带有字典的列表数据与页面js交互
  11. Unreal Engine 4 编码规范
  12. 利用IDM没办法从B站下视频?下载悬浮条不显示?解决方案来了!
  13. 2022年四川省科技型中小企业申报条件材料流程及奖励扶持
  14. 51cto python数据分析系列课程 55g_热图_ Python数据分析系列视频课程--玩转数据可视化_数据可视化视频-51CTO学院...
  15. 业务与信息系统乱弹琴
  16. MySQL 综合分析题_MySQL练习题:综合面试题
  17. 自己动手做聊天机器人 二十九-重磅:近1GB的三千万聊天语料供出
  18. 卡罗拉 (COROLLA) - 开启引擎盖
  19. AST-2600及AST-2400在uboot中更新固件的方法
  20. 创建独立的Python化学信息学环境

热门文章

  1. Resis 性能测试
  2. Day09 红帽Linux — 1管理本地用户和组
  3. 海康摄像机/录像机rtsp视频流地址格式
  4. GOF设计模式趣解(23种设计模式)
  5. 中央任命!中科院院士北大副校长,出任985大学校长(副部长级)
  6. novel research
  7. 河南工程学院计算机协会招新,计算机协会招新情况新闻稿
  8. 南京大学网络教育学院计算机期末,南京大学网络教育2021年春季期末课程考试在线模拟测试的通知...
  9. 诺华创血小板减少症新药纳入新版国家医保目录
  10. vue slots 透传