我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android ExpandableListView长按事件的完美解决办法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android ExpandableListView长按事件的完美解决办法

关于ExpandableListView长按事件处理,网上很多都是使用将上下文菜单注册到ExpandableListView上实现长按事件。
这样做弊端显而易见,不够灵活,不能分别对父项、子项、父项之间、子项之间弹出内容做区分。
下面来说我的解决方法,方法有点投机取巧。首先说明一点,使用我这种方法必须使用自定义的BaseExpandableListAdapter,至于为什么,具体后面讲到。
ExpandableListView本身有继承自AdapterView的setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener)方法。
实现监听器:
代码如下:

 private class QuickWayListener implements OnItemLongClickListener{
  @Override
  public boolean onItemLongClick(AdapterView<?> arg0, View view,
    int pos, long id) {
   //pos不可用说明见下文
   return false;
  }
 }

如果这个方法是用在ListView长按事件中刚刚好,但在ExpandableListView中,第三个参数pos不能区分开点击的是父项还是子项,以及哪个父项或子项。
在ExpandableListView响应的onItemLongCkick方法中,pos参数值为:从上到下,父项+展现的子项到点击位置的数目(注意:是展现的,隐藏的子项不包括,从0开始)。
例如:
父项1(隐藏3个子项)
父项2
 |—子项2-0
 |—子项2-1
 |—子项2-2
长按子项2-1时,pos值为3。显然根据pos值是无法确定点击的是哪个子项或父项的。
因此依赖pos是很难处理点击位置的。
如果可以直接在onItemLongClick方法中获取groupPos,及childPos该多好呢?

于是看到了onItemLongClick方法第二个参数:view。这里的view是你按中的位置对应的view。view有个方法getTag(int key)。如果在创建此view的时候就把groupPos,childPos通过setTag(int key, Object value)设置进去,在响应onItemLongClick不就可以直接拿出来用了么。
现在就要讲到必须使用自定义的BaseExpandableListAdapter的理由了。
要把groupPos,childPos通过setTag的方式绑定到view中,就必须操作该view的创建过程。要控制这个过程就必须要在自定义BaseExpandableListAdapter中重写getGroupView及getChildView方法进行操作。如下:
代码如下:
public class AccountListAdapter extends BaseExpandableListAdapter {
 ...省略其他方法
 @Override
 public View getChildView(int groupPosition, int childPosition,
   boolean isLastChild, View convertView, ViewGroup parent) {
  //我这里仅通过自己写的mkChildView()方法创建TextView来显示文字,更复杂的可以通过LayoutInflater来填充一个view
  TextView childTv = mkChildView();
  // 标记位置
  // 必须使用资源Id当key(不是资源id会出现运行时异常),android本意应该是想用tag来保存资源id对应组件。
  // 将groupPosition,childPosition通过setTag保存,在onItemLongClick方法中就可以通过view参数直接拿到了!
                childTv.setTag(R.id.xxx01, groupPosition);
  childTv.setTag(R.id.xxx02, childPosition);
  return childTv;
 }
 @Override
 public View getGroupView(int groupPosition, boolean isExpanded,
   View convertView, ViewGroup parent) {
  TextView groupTv = mkGroupView();
  // 设置同getChildView一样
  groupTv.setTag(R.id.xxx01, groupPosition);
  groupTv.setTag(R.id.xxx02, -1); //设置-1表示长按时点击的是父项,到时好判断。
  groupTv.setText(groups[g roupPosition]);
  return groupTv;
 }
}

完成了这一步,我们只需要在ExpandableListView响应的onItemLongClick方法时通过view.getTag(R.id.xxx01),view.getTag(R.id.xxx02)即可拿到groupPos,childPos.
如下:
代码如下:
      
 private class QuickWayListener implements OnItemLongClickListener{
  @Override
  public boolean onItemLongClick(AdapterView<?> arg0, View view,
    int pos, long id) {
   int groupPos = (Integer)view.getTag(R.id.xxx01); //参数值是在setTag时使用的对应资源id号
   int childPos = (Integer)view.getTag(R.id.xxx02);
   if(childPos == -1){//长按的是父项
       //根据groupPos判断你长按的是哪个父项,做相应处理(弹框等)
   } else {
       //根据groupPos及childPos判断你长按的是哪个父项下的哪个子项,然后做相应处理。 
   }
   return false;
  }
 }

到这就写完了,貌似比较啰嗦。重写BaseExpandableListAdapter写的比较简洁,没看明白的朋友可以先到网上查下怎么自定义BaseExpandableListAdapter,和自定义BaseAdapter其实是一样的。
您可能感兴趣的文章:Android 关于ExpandableListView刷新问题的解决方法Android UI控件ExpandableListView基本用法详解Android改变ExpandableListView的indicator图标实现方法分享Android中ExpandableListView控件使用教程Android中ExpandableListView的用法实例android使用ExpandableListView控件实现小说目录效果的例子Android ExpandableListView展开列表控件使用实例Android之IphoneTreeView带组指示器的ExpandableListView效果Android之带group指示器的ExpandableListView(自写)Android中ExpandableListView使用示例详解


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android ExpandableListView长按事件的完美解决办法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android ExpandableListView长按事件的完美解决办法

关于ExpandableListView长按事件处理,网上很多都是使用将上下文菜单注册到ExpandableListView上实现长按事件。这样做弊端显而易见,不够灵活,不能分别对父项、子项、父项之间、子项之间弹出内容做区分。下面来说我的解
2022-06-06

vue长按事件和点击事件冲突的解决

这篇文章主要介绍了vue长按事件和点击事件冲突的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

Android ScrollView嵌套ExpandableListView显示不正常的问题的解决办法

Android ScrollView嵌套ExpandableListView显示不正常的问题的解决办法 前言: 关于ScrollView嵌套ExpandableListView导致ExpandableListView显示不正常的问题解
2022-06-06

Discuz 自动同步登陆的完美解决办法

但Discuz的同步登陆问题是个头疼的问题,网上搜http://www.cppcns.com搜,类似的文章、贴子无数,也参考过很多的文章,始终没能完美地解决自己系统登陆后同步登陆Discuz的问题;在开发机上正常的,放到服务器上就会出现无法
2022-06-12

Android开发软键盘遮挡登陆按钮的完美解决方案

在应用登陆页面我们需要填写用户名和密码。当填写这些信息的时候,软键盘会遮挡登陆按钮,这使得用户体验较差,所以今天就来解决这个问题 1:登陆布局界面如下
2022-06-06

Linux中没有rc.local文件的完美解决方法

比较新的linux发行版已经没有rc.local文件了。因为已经将其服务化了。 解决方法: 1、设置rc-local.servicesudo vim /etc/systemd/system/rc-local.service [Unit]De
2022-06-04

JQuery动态生成的按钮无法触发问题及完美解决方法

利用JQuery动态添加的按钮无法通过$(selector).click方法触发点击事件,下面小编给大家带来了JQuery动态生成的按钮无法触发问题与解决方法,需要的朋友可以参考下
2023-02-02

mac 安装omyzsh后不执行~/.bash_profile、~/.bashrc的完美解决办法

mac 安装 omyzsh 后, terminal瞬间逼格飙升! 但是! terminal init的时候并不会执行~/.bash_profile、~/.bashrc等脚本了, 这是因为其默认启动执行脚本变为了~/.zshrc。 解决办法就
2022-06-04

Android防止按钮过快点击造成多次事件的解决方法

问题onClick事件是Android开发中最常见的事件。比如,一个submitButton,功能是点击之后会提交一个订单, 则一般代码如下,其中submitOrder()函数会跳转到下一页进行处理 ://代码0 submitButton
2022-06-06

最近关于Navicat到期的完美解决办法(亲测有效)

这篇文章主要介绍了最近关于Navicat到期的完美解决办法(亲测有效),需要的朋友可以参考下
2023-02-09

Android滑动事件冲突的解决方法

滑动是Android中不可缺少的一部分,多个滑动必然会产生冲突,比如我们最常见的是ScrollView中嵌套了ListView,一般做法是计算出ListView的总高度,这样就不用去滑动ListView了。又比如一个ViewPager嵌套F
2022-06-06

完美解决 AndroidStudio Gradle 下载jar包慢Android Studio : Read timed out和connect timed out的解决方法

在项目当中找settings.gradle.kts文件将其 找到上图的文件,按照上图进行将下面内容进行替换 新版本 maven { url = uri("https://maven.aliyun.com/repository/public"
完美解决 AndroidStudio Gradle 下载jar包慢Android Studio : Read timed out和connect timed out的解决方法
2023-12-23

Android判断软键盘弹出并隐藏的简单完美解决方法(推荐)

最近项目中有一个编辑框,下面是个ListView。在触发编辑框弹出软键盘后,ListView还能滑动,并且ListView的item还能响应单击。这样的体验效果很不好。于是便想在滑动或单击item时判断键盘是否弹出,若弹出,则把它隐藏。 网
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录