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
相关产品推荐
相关产品推荐

