GridView中使用ItemModel类修改card_item.xml背景色选中异常问题咨询
GridView点击条目多卡片同步选中问题解决方案
问题根因
该问题是GridView的View复用机制导致的:GridView只会创建屏幕可见范围+少量额外的View实例,当条目滑出屏幕时,系统会直接将该View对象复用给新滑入的条目。你直接修改被点击View的背景属性后,这个被修改过的View后续被复用到其他位置时,就会出现不相关条目同步显示选中态的问题。
正确实现步骤
- 新增状态存储字段:在你的列表数据源实体类中添加
boolean isSelected字段,默认赋值为false,所有条目的选中状态统一存在数据源中,不要存储在View对象上。 - 统一在getView中设置背景:重写Adapter的
getView()方法,无论当前加载的View是不是复用对象,都根据当前位置对应数据源条目的isSelected值设置CardView背景:值为true时设置选中态背景,值为false时设置默认背景。 - 点击事件修改数据源后刷新:给GridView设置
OnItemClickListener,点击条目时先修改对应位置数据源的isSelected值(如果是单选逻辑,需要先把所有其他条目的isSelected设为false,再修改当前点击条目的状态),最后调用Adapter的notifyDataSetChanged()触发全局重绘,或调用notifyItemChanged(点击位置)仅刷新对应条目,性能更优。
核心注意点
所有AdapterView(GridView、ListView等)的条目展示属性都要和数据源绑定,不要直接修改子View的属性,从根源上规避复用带来的状态错乱问题。
内容的提问来源于stack exchange,提问作者Fábio Monteiro
相关产品推荐
相关产品推荐

