You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

API 26+中ExpandableListView点击事件失效问题求助

嘿,这个问题我之前帮不少开发者排查过,API26(Android 8.0)之后Google对View系统的一些细节做了调整,正好对应你遇到的情况,咱们一步步来解决:

问题分析与针对性解决方案

1. EmptyView 无法正常显示的问题

API26之后,setEmptyView()的生效规则变严格了:EmptyView必须和ExpandableListView处于同一个父容器下,之前的低版本可能允许EmptyView在其他布局容器里,但高版本会直接忽略。

如果不想调整布局结构,也可以手动控制EmptyView的可见性,替代系统的setEmptyView():

// 注册适配器的数据观察者,监听数据变化
mChapterAdapter.registerDataSetObserver(new DataSetObserver() {
    @Override
    public void onChanged() {
        super.onChanged();
        boolean hasData = mChapterAdapter.getGroupCount() > 0;
        mChapters.setVisibility(hasData ? View.VISIBLE : View.GONE);
        findViewById(R.id.empty).setVisibility(hasData ? View.GONE : View.VISIBLE);
    }
});

2. 子项点击事件(OnChildClickListener)失效的问题

如果是子项点击没反应,大概率是这几个原因:

  • 子项布局中有抢占焦点的View:比如Button、CheckBox这类自带可点击属性的控件,会把焦点抢走,导致ExpandableListView的点击事件触发不了。解决办法是给这些控件添加:
    android:focusable="false"
    android:focusableInTouchMode="false"
    
    或者在子项的根布局添加:
    android:descendantFocusability="blocksDescendants"
    
  • 适配器的isChildSelectable方法返回false:API26+对这个方法的检查更严格了,如果你的ChapterListViewAdapter继承自BaseExpandableListAdapter,一定要确保这个方法返回true:
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true; // 允许子项被点击
    }
    
  • 点击事件的返回值错误:onChildClick的返回值决定了事件是否被消费,如果返回false,事件会向上传递,可能导致你的逻辑不执行。根据业务需求返回true(消费事件)即可。

3. 其他可能的排查点

  • 检查动态权限:如果你的适配器需要读取本地文件、存储等数据,API23+需要动态申请权限,API26+对权限的校验更严格,权限申请失败会导致数据加载为空,看起来像是ListView不工作。
  • 检查适配器的数据加载逻辑:确认在高版本系统下,数据源是否正常初始化,有没有因为文件路径、系统限制导致数据为空的情况。

内容的提问来源于stack exchange,提问作者user1373996

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:05:54