`

Android ListView 问题汇总

 
阅读更多
Listview 问题汇总:

1. item 中的check view 选中混乱
ListView 缓存机制导致的。
解决方案可以是:
在adapter里的getView方法里先调用holder.cbIamge.setOnCheckedChangeListener方法,
再调用holder.cbIamge.setChecked方法即可解决问题。(holder.cbIamge)是一个CheckBox对象。
若还要实时记录CheckBox选中了的数量,则上面的解决方案还是不管用,通过在网上的搜索,终于找到了解决方案,在此记录一下,该网址为:http://stackoverflow.com/questions/6100518/checkbox-auto-call-oncheckedchange-when-listview-scroll
该解决方案是:
在adapter中调用holder.cbIamge.setChecked()时先将CheckBox的监听设为空(holder.cbIamge.setOnCheckedChangeListener(null);)
再调用holder.cbIamge.setChecked()方法
最后重新设定CheckBox的监听holder.cbIamge.setOnCheckedChangeListener(new OnCheckedChangeListenerImpl(holder, position));

2. item 内容重复
   View 的复用导致的,每次getview调用时都设置其内容

3. 第一条item 的对象记录错误
   曾经在项目中遇到这样的需求,选中GridView 中某一项,标记选中项,我的解决方案是:用个sharepreference或者数据库或者其他记录被选中的id,在getView时判断item的id和记录的id一致时,标记item(可以是设置背景色等),记录被标记的ViewHolder lastHolder, 当下一个item被选中时,将先前的lastHolder复原。
在这样的case下会出现问题,选中第一条,退出应用,重新打开应用,选中第二条,这时,第一条仍旧被选中。
另外一条原理上一样的case: 选中item1, 编辑界面上某个EditText 弹出keyboard, 隐藏keyboard,选中第二条case,这时,第一条仍旧被选中。
先说一下第二条的原因:
Activity 可以配置windowSoftInputMode 的属性,若不配置当keyboard弹出,会重新绘制界面,ListView 当height设置为wrapcontent 或者 matchparent,listView的第一条数据会绘制多次,所以记录的 lastHolder 与我们看到的第一条item未必是匹配的,这是操作lastHolder 没有任何变化。这样前面的case也可以解释通,第一条item被绘制多次,
lastHolder记录的对象并不是界面上看到的对象。

解决方案:
针对keyboard弹出导致的第一条item绘制多次可以将 windowSoftInputMode  设置成 adjustNothing 让keyboard 弹出时不重新绘制界面,但是解决不了第一个场景,可以重写GridView或者Listview 在onMeasure方法时记录flag,如果已经绘制显示出来,则lastHolder不在重新赋值

最后附件附上一个Android 开发 UI 的开发建议文档

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics