ExpandableListView为child子列表添加长按事件(有部分内容是网上内容,但大部分是我自己的理解)
2016-11-12 21:51
477 查看
Android的ExpandableListView继承自ListView,扩展了一些功能,实现的效果类似于QQ的好友分组。下面是我自己编的一个小软件截图,ExpandableListView的效果就是这样的:但是 ExpandableListView提供了setOnGroupClickListener(onGroupClickListener)监听方法,也提供了setOnChildClickListener(onChildClickListener)监听方法。却偏偏没有提供group(组)和child(子)的长按监听方法,如setOnChildLongClickListener(onChildLongClickListener)与setOnChildLongClickListener(onChildLongClickListener); 这两种监听方法是不存在的。只存在普通的setOnItemLongClick( onItemLongClickListener )。设置以后,实现监听:这个方法当然是无法得知点击的group和child的位置的。且ExpandableListView 会被当做普通的 ListView 处理,group 与 child 都是item,不进行区分,此时 position 的值就是 item 的位置。即group 与 child 不分级,按顺序排列。编号情况是这样的:于是去上网上寻找解决方法,但是一直没有找到。终于有一天找到了!!下面提供这种解决方法,能判断出长按的是goup还是child,且能够获取到group与child的位置。是从网上找到的:首先在 xxxActivity.java的onCreate方法里面添加这样的代码:
exList.setOnItemLongClickListener(onItemLongClickListener);
然后,自定义OnItemLongClickListener类的对象onItemLongClickListener,代码在下面:
private AdapterView.OnItemLongClickListener onItemLongClickListener = new AdapterView.OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {final long packedPosition = exList.getExpandableListPosition(position);final int groupPosition = ExpandableListView.getPackedPositionGroup(packedPosition);final int childPosition = ExpandableListView.getPackedPositionChild(packedPosition);//长按的是group的时候,childPosition = -1if (childPosition != -1) {AlertDialog.Builder builder= new AlertDialog.Builder(context);builder.setTitle("警告");builder.setMessage("您生在试图删除该条数据,确定删除吗?");builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Db db = new Db(context,"pwprotect",null,1);SQLiteDatabase dbWrite = db.getWritableDatabase();int result = dbWrite.delete(type[groupPosition],"_id=?",new String[]{""+
childs_id[groupPosition][childPosition]});dbWrite.close();if(result == 1){refrash();Toast.makeText(context,"删除成功",Toast.LENGTH_SHORT).show();}}});builder.setNegativeButton("取消",null);builder.show();}return true;}};
其中,exList是获取到的ExpandableListView组件,它里面有一个exList.getExpandableListPosition(position)非静态方法,
可以将列表位置的原始位置(position)转换为群组组或子项位置,获取是的packed(包装/打包)位置。
即调用的是 getPackedPosition()。
获取到packedPosition后,可以调用 ExpandableListView 的静态方法,真正取得group 与 child的位置。
取得group位置: ExpandableListView.getPackedPositionGroup(packedPosition); 说明:group位置从0开始。
取得child位置: ExpandableListView.getPackedPositionChild(packedPosition); 说明:child位置从0开始,如果点击的goup 没有 child , 返回-1。
这里需要注意的是:groupPosition永远返回点击的group在所有group中得位置,比如一共有7个group,点击了第2个group,那么groupPosition将返回1(group的值从0开始,因此第一个group返回0)。当点击的是group的时候,childPosition永远得到的是-1,不管group里面有没有child。当点击的是child的时候,childPosition将得到该child在它所属的group里面的位置,比如点击的是第3个child,那么childPosition会返回2,因为childPosition也是从0开始的。至此,能够取得 groud 与 child 的位置,且根据 child 位置是否为-1,就能够正确判断点击的是child还是group。最后,就可以思考是否可以通过这样的方法,继承自ExpandableListView,加入接口回调,整出前面提到的 OnGroupLongClickListener 和 OnChildLongClickListener。而如果全新定义一个类似于 ExpandbaleListView 的 view ,似乎更加灵活,当然,这也意味着工程会相当浩大,难度相当有。
相关文章推荐
- js给列表添加点击事件,返回相应内容
- Sharepoint 2007中可在列表中添加的内容类型
- 关于下拉列表Dropdownlist添加内容的问题
- 大部分内容为网上整理其它高人的帖子,现只作整理,用于查看:
- 对部分<input>标签添加onclick事件
- 深入理解JavaScript的闭包特性 如何给循环中的对象添加事件
- 左侧列表栏添加了一项内容
- 初学者对通讯录软件开发的整体把握与分块实现------添加列表新内容并实现界面的跳转
- 关于Dom部分操作各浏览器兼容(setAttribute 与添加事件)
- 第五部分 给程序添加退出事件
- android TextView、EditText对部分内容设置颜色、字体、超链接、图片、点击事件
- javascript操作两个选择列表(有两个列表,如何实现在一个列表通过双击和多选列表中内容添加到另一个列表. )
- 左侧列表栏添加了一项内容
- 左侧列表栏添加了一项内容
- jquery网上学习,编码测试网址及部分内容(在线学习)
- 使用JavaScript以,号分割文本框内容为数组并添加到下拉列表
- 左侧列表栏添加了一项内容
- MOSS列表事件监听中再次更新列表项内容 SPListItem.Update() 导致循环
- 在Button样式中添加EventSetter,理解路由事件
- fckeditor 添加blur事件 判断是否填写内容 firefox、ie