一般为了避免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与当前
android ListView使用ViewHolder优化时,EditText设置TextWatcher时,滑动ListView导致内容错乱
最新推荐文章于 2021-01-07 19:56:45 发布