关于android的ListView的getCheckItemIds无法准确得到被选checkbox的bug

来源:互联网 发布:ubuntu安装gfirefly 编辑:程序博客网 时间:2024/04/30 20:01

最近在项目中发现当android的listview是多选模式加载数据的,那么listview的getCheckItemIds()方法所得到数据是不精确的,当你选中其中一项item,然后又取消的时候getCheckItemIds()还是能得到你刚刚取消的listitem的id值,原因在于google在Listview的源码中出现BUG,大家可以翻阅android 的Listview的getCheckItemIds()这个方法的源码就会发现这个问题,我的解决办法是重写一个adapter我现在是用的内部类实现代码如下:

在这个adapter中我的ListItem布局文件是用的系统的android.R.layout.simple_list_item_multiple_choice文件,这个文件可以在android模拟器下面的platforms下面的目录中找到,如果有什么不明白大家可以去看下文件中是怎么定义的。

这里值得注意的是当listitem布局里面包含了checkbox的时候listview的onItemClickListener()事件将被checkbox的onClickListener()事件覆盖,这是由于checkbox的onClick事件优先级要高于ListView的onItemClick事件,解决的办法可以把checkbox的focus和和clickable和touchClickable等属性设置为false即可,我现在这里之所以设置为true是因为我用的系统的android.R.layout.simple_list_item_multiple_choice布局文件这个文件的clickabel属性默认是false,也不知道是什么原因,当触发listview的onItemClick事件的时候点击的那个listitem的下标位置会变动,比如说当前列表中有2条数据,当单击第一条的时候第2条会变成第一条,第一条会变成第二条数据,所以我只有利用前面说的BUG,让listView的ononItemClick事件失效,利用checkTextView的onClick事件来实现当用户单击ListItem时改变checkbox的状态,只是这种实现会导致单击listitem被单击时失去原有的效果。

至于listitem数据为什么会出现位置混乱的原因还正在研究中,如果高手知道原因不妨共享下解决方法与原因,呵呵。

总之感觉android平台的bug还是蛮多的啊,google的开发质量还有待提高啊。