安卓ExpandableListView长按监听判断点击的item属于哪个group(群组)和child(子项)
2016-04-14 01:46
603 查看
安卓的ExpandableListView 继承自ListView,扩展了一些功能,实现的效果类似于QQ的好友分组。
如图:
但是 ExpandableListView 提供了setOnGroupClickListener(onGroupClickListener)监听方法,也提供了setOnChildClickListener(onChildClickListener)监听方法。
却偏偏没有提供group(组)和child(子)的长按监听方法,如setOnChildLongClickListener(onChildLongClickListener)与setOnChildLongClickListener(onChildLongClickListener);
这两种监听方法是不存在的。
只存在普通的setOnItemLongClick( onItemLongClickListener )。设置以后,实现监听:
这个方法当然是无法得知点击的group和child的位置的。且ExpandableListView 会被当做普通的 ListView 处理,group 与 child 都是item,不进行区分,此时 position 的值就是 item 的位置。即group 与 child 不分级,按顺序排列。
图示:
于是翻看ExpandableListView 的api,找到了解决办法,判断出了长按的是goup还是child,且能够获取到group与child的位置。
代码:
其中,elv_test.getExpandableListPosition(position); 该方法是非静态的,可以将列表位置的原始位置(position)转换为群组组或子项位置,获取是的packed(包装/打包)位置。即调用的是 getPackedPosition()。
获取到packedPosition后,可以调用 ExpandableListView 的静态方法,真正取得group 与 child的位置。
取得group位置:
ExpandableListView.getPackedPositionGroup(packedPosition);
说明:group位置从0开始。
取得child位置:
ExpandableListView.getPackedPositionChild(packedPosition);
说明:child位置从0开始,如果点击的goup 没有 child , 返回-1。
至此,能够取得 groud 与 child 的位置,且根据 child 位置是否为-1,就能够正确判断点击的是child还是group。
最后,就可以思考是否可以通过这样的方法,继承自ExpandableListView,加入接口回调,整出前面提到的 OnGroupLongClickListener 和 OnChildLongClickListener。
而如果全新定义一个类似于 ExpandbaleListView 的 view ,似乎更加灵活,当然,这也意味着工程会相当浩大,难度相当有。
如图:
但是 ExpandableListView 提供了setOnGroupClickListener(onGroupClickListener)监听方法,也提供了setOnChildClickListener(onChildClickListener)监听方法。
却偏偏没有提供group(组)和child(子)的长按监听方法,如setOnChildLongClickListener(onChildLongClickListener)与setOnChildLongClickListener(onChildLongClickListener);
这两种监听方法是不存在的。
只存在普通的setOnItemLongClick( onItemLongClickListener )。设置以后,实现监听:
@Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { retrun false; }
这个方法当然是无法得知点击的group和child的位置的。且ExpandableListView 会被当做普通的 ListView 处理,group 与 child 都是item,不进行区分,此时 position 的值就是 item 的位置。即group 与 child 不分级,按顺序排列。
图示:
于是翻看ExpandableListView 的api,找到了解决办法,判断出了长按的是goup还是child,且能够获取到group与child的位置。
代码:
@Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { final long packedPosition = elv_test.getExpandableListPosition(position); final long groupPosition = ExpandableListView.getPackedPositionGroup(packedPosition); final long childPosition = ExpandableListView.getPackedPositionChild(packedPosition); if (childPosition == -1) {//长按的是group,childPosition为-1 } else{//否则长按的是child } Log.d("测试", packedPosition+" "); Log.d("测试"," 长按的组群位置:" + groupPosition); Log.d("测试", "长按的子项位置:" + childPosition); return true; }
其中,elv_test.getExpandableListPosition(position); 该方法是非静态的,可以将列表位置的原始位置(position)转换为群组组或子项位置,获取是的packed(包装/打包)位置。即调用的是 getPackedPosition()。
获取到packedPosition后,可以调用 ExpandableListView 的静态方法,真正取得group 与 child的位置。
取得group位置:
ExpandableListView.getPackedPositionGroup(packedPosition);
说明:group位置从0开始。
取得child位置:
ExpandableListView.getPackedPositionChild(packedPosition);
说明:child位置从0开始,如果点击的goup 没有 child , 返回-1。
至此,能够取得 groud 与 child 的位置,且根据 child 位置是否为-1,就能够正确判断点击的是child还是group。
最后,就可以思考是否可以通过这样的方法,继承自ExpandableListView,加入接口回调,整出前面提到的 OnGroupLongClickListener 和 OnChildLongClickListener。
而如果全新定义一个类似于 ExpandbaleListView 的 view ,似乎更加灵活,当然,这也意味着工程会相当浩大,难度相当有。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories