android 动态多选框,Adapter实现ListView带多选框等状态的自定义控件的注意事项

Adapter实现ListView带多选框等状态的自定义控件的注意事项

更新时间:2013年01月21日 14:43:17   作者:

Android本身为ListView提供了几个方便的Adapter,比如ArrayAdapter、SimpleCurrentAdapter等等,接下来介绍自定义Adapter实现ListView带多选框等状态控件的注意事项,感兴趣的朋友可以详细了解下,或许对你有所帮助

Android本身为ListView提供了几个方便的Adapter,比如ArrayAdapter、SimpleCurrentAdapter等等。但是为了实现更复杂的列表视图和控制,一般都要继承BaseAdapter来实现自己的Adapter。

我需要的ListView是如图一样的实现SD卡资源文件浏览列表,每个列表项由一个ImageView、TextView、CheckBox组成,并且要求当整个列表中有一个或一个以上的Checkbox被选中时,右上角的搜索按钮就显示出来,否则就隐藏,因此需要对每个列表项的CheckBox设置监听器。若使用Android提供的Adapter实现起来比较复杂,所以我选择继承BaseAdapter来实现自己的Adapter。

首先要知道的是ListView显示原理。ListView接收了Adapter之后,ListView的列表项数据是来源于接收的Adapter的。当ListView要展现出来的时候,ListView就会调用Adapter的getCount方法来获得一共需要绘制多少个列表项,之后就开始调用getView方法来获得每个列表项的View进行装载。也就是说ListView的列表项就是每次调用getView返回的View,每次调用getView获得的列表项View是什么样子,我们看到的这个列表项就是什么样子。

我继承BaseAdapter来实现自己的Adapter,至少需要重写基本的getView、getCount、getItem、getItemID四个方法。其中getCount和getView的功能如上所述,所以我要想实现对每个列表项多选框按钮的监听就需要在getView中返回View给ListView之前,对View中的多选框设置监听器。getView方法中带三个参数public View getView(int position,View convertView,ViewGroup parent),一般都是将convertView最为返回的View。

在这里,需要插播说明一下Android系统对ListView的实现小细节。Android构造ListView列表项的时候每次只会构造足够满足屏幕显示数量的列表项,一般都是10个左右。当ListView的列表项多于屏幕能够显示的列表项的时候,ListView就可以上下拉动,每次拉动显示后续列表项时就会再次调用getView方法来构造后续列表项的View。如果ListView是首次显示出来,那么getView的参数View convertView就是null空的;如果是拉动ListView调用的getView,那么这时getView的参数convertView就不再是null,而是随着拉动刚刚被拉走隐藏掉的列表项的View。这么做的好处是可以节省资源。

基于这个细节,如果重写getView方法时,要将参数convertView作为返回View,那么getView中就应该判断convertView是否为null。为空的话就需要使用Inflater构造出来,不为空的话就可以直接使用了。我的需求中需要对多选框进行监听,所以在返回convertView之前需要中convertView中获取多选框控件并设置监听器。

一开始,我以为这样就能够实现我的需求了,但是出来的结果却意想不到。当我点击一个多选框后,将列表往下拉,下面出来的没有选中的列表框也变成选中的状态。注意到我每次点击一个多选框后往下拉同步被选中的多选框的距离都是不变的,总是相隔11项。于是,回想getView中convertView参数的特点,当我往下拉的时候,ListView调用getView方法中的convertView就是回收来的因为拉动被隐藏的View。在我这个例子中,由于多选框是一种带有状态标示的控件,我的getView没有对其状态进行重新设置,所以就造成了这种奇怪现象。我的解决方法是在我实现的Adapter类中创建一个boolean数组用于保存对应列表项多选框的状态(getView中第一个参数position就是列表项ID,是根据数据来标识,不是根据列表项View来标识的,所以可以根据position来对列表项数据进行选中和非选中标识),每次调用getView都会在其中判断position位置上的boolean值来决定多选框的状态。

同样的,基于这个原理,使用其它带状态的控件也需要注意getView回收的问题。当然,也可以不使用convertView最为getView的返回结果,而在getView每次调用都重新构造一个View,或者Adapter类中构造一个与数据数量等长的View数组。不过这么做的话就比较消耗资源。

另外,BaseAdapter中的getItem和getItemId方法再构造ListView构造过程中并没有使用过,不过据说是在关于ListView的一些监听器中会调用到,所以继承BaseAdapter时最好也给这两个方法返回一个有意义的值。getItemId一般返回对应的position,getItem返回对应position的列表数据对象。

相关文章

1a1b05c64693fbf380aa1344a7812747.png

这篇文章主要为大家详细介绍了Android Studio使用ViewPager+Fragment实现滑动菜单Tab效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-09-09

4f55910a645b073bc4fc65dc10dc14bd.png

这篇文章主要为大家详细介绍了android自定义view制作圆形进度条效果的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-01-01

0ea3c7666119d5615e582f823fb3fad6.png

这篇文章主要介绍了Android获取SD卡路径及SDCard内存的方法,较为详细的分析了Android针对SD卡操作所涉及的类及其具体函数功能,非常具有实用价值,需要的朋友可以参考下2015-02-02

4f96a78db829b1556ff16de21e013c7a.png

如何在Android中实现分享功能?这篇文章主要为大家详细介绍了Android实现分享功能的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2016-11-11

8cc1031babc6aff2319f1c6af8544aa0.png

这篇文章主要为大家详细介绍了android实现多线程断点续传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-11-11

0c932a99bb7b6f23c937db507070cc7b.png

这篇文章主要介绍了Android开发之菜单(menu)用法,结合实例形式较为详细的分析了Android菜单的实现步骤与相关操作技巧,需要的朋友可以参考下2017-03-03

cca732bf65a93ed2ec0ac80c638460fe.png

Android Studio从3.0版本新增了许多功能,当然首当其冲就是从3.0版本新增了对 Kotlin 开发语言的支持,除此之外还有其他一些新功能。很多小伙伴在android studio 3.0 升级项目遇到很多问题,下面小编给大家分享一些问题小结及解决办法,一起看看吧2017-11-11

2d9f31f2af7b675a3d153d2b7f1035a7.png

这篇文章主要介绍了Android编程使用Intent传递对象的方法,结合实例形式详细分析了Android使用Intent实现传递对象的相关技巧与注意事项,需要的朋友可以参考下2016-01-01

b452cee8ec5cd9e58ab98eba17281e59.png

这篇文章主要给大家介绍了关于Android动画系列教程之属性动画的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-12-12

f4838ec7e2d4da28e0b57d4e852dadd4.png

今天小编就为大家分享一篇关于将cantk runtime嵌入到现有的APP中的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2018-12-12

最新评论

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值