android ListView使用ViewHolder优化时,EditText设置TextWatcher时,滑动ListView导致内容错乱

一般为了避免ListView卡顿,会在 adapter 的 getView方法中使用 convertView 和 ViewHolder 优化。这样可以重用之前加载过的布局并减少在母视图中查找子视图的时间,以达到最大限度优化的目的。
当ListView的Item中有要支持更新操作的控件时,一般要添加各种监听器。这里就要注意布局重用带来的问题;因为重用布局时,某一次 getView中使用的convertView可能是之前使用过的,里面的子视图的监听事件仍然有效,而重新设置子视图的值时,会使得之前注册的监听事件错误地执行。比如下面这段代码,如果EditText的TextWatcher使用注释掉的代码添加,则滑动ListView时,由于重用布局的 EditText 的内容发生了改变,为其注册的监听器发生作用,但是 onTextChanged 方法执行时,里面的position 仍是该EditText 第一次使用时的 position(内部类创建时使用的final 的position 不会随外部的position而变化)。于是代码就错误地更新了 该EditText第一次使用时的 position位置上的 CommField。
对于有些监听器,比如 RadioButton 的 选中状态变化监听,可以采用 每一次 getView 时都先重设 监听器,再设置RadioButton 的值,来避免该问题。但是 EditText的TextWatcher 监听器使用同样的方法却无法避免,甚至 每次getView 中先移除监听器,再设值,再重新添加监听器,都仍然会出现前面的错误。
这种情况下,可以使用下面代码中未被注释的方式,把当前 position 挂载在EditText 上, 更新时取EditText中挂载的position,这样就可以保证position与当前

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值