很长时间没有使用 ExpandableListView 了,kotlin 也上手使用了很长时间,前几天业务重构时候,想使用 ExpandableListView 来实现新的展开模式,但是却发现没法给 ExpandableListView 设置适配器了,一度怀疑是 Android 源码出 bug 了,时隔多年,又在作什么妖

众所周知,ExpandableListView 的 adapter 需要继承 BaseExpandableListAdapter,并实现其中的一大坨方法

但是我们给 ExpandableListView 的 adapter 赋值的时候,却报错了

mExpandableListView.adapter = mBaseExpandableListAdapter


    /**
     * This overloaded method should not be used, instead use
     * {@link #setAdapter(ExpandableListAdapter)}.
     * <p>
     * {@inheritDoc}
     */
    @Override
    public void setAdapter(ListAdapter adapter) {
        throw new RuntimeException(
                "For ExpandableListView, use setAdapter(ExpandableListAdapter) instead of " +
                "setAdapter(ListAdapter)");
    }


以上为 ExpandableListView 的 setAdapter 的源码,可以看到,这是重写的 ListView 的 setAdapter 方法,ExpandableListView 是继承 ListView 的

从源码可以清晰的看出,需要传进去 ListAdapter

然后看了一下 BaseExpandableListAdapter 的父类,居然没有 ListAdapter。

这,,,

然后仔细看了下抛出的异常提示:For ExpandableListView, use setAdapter(ExpandableListAdapter) instead of setAdapter(ListAdapter)

意思是用另一个接收 ExpandableListAdapter 的重载来代替 当前这个

翻官方文档

果然
在这里插入图片描述
那为什么之前用 java,一直没有出现过这个问题呢?

kotlin 中,直接 mExpandableListView.adapter 自动调用的是重写的父类的 setAdapter,他接收的是 ListAdapter 参数

而他的另一个,接收 ExpandableListAdapter 的方法,则需要写成 mExpandableListView.setAdapter()

至此,问题解决

在这里插入图片描述

关注这个公众号92元充100话费、可以每天领外卖、买菜优惠券,便宜的电影票、还有联通校园卡500两年,200分钟国内通话/月,20G全国流量/月+20G北京校园区域流量/月。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐