【Android】ListView addHeaderView低版本报错问题

本文详细介绍了在使用ListView时遇到的非法状态错误问题,即在setAdapter之后尝试添加头视图。通过分析错误原因,文章提供了两种解决方案:在添加头视图前清空Adapter,或移除xml布局中的entries属性。同时,展示了实际项目中采用的方法来确保代码的正确执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.ListView 不能在setAdapter之后addHeadView
说明
java.lang.IllegalStateException: Cannot add header view to list – setAdapter has already been called

1.必须在setAdapter之前执行addHeaderView方法

2.xml中有entries属性的话,adapter会自动调用,在android4.3之前的系统即使在setAdapter之前调用addHeaderView也会报错
If you were used android:entries in ListView in xml file, Its called setAdapter() method before addHeaderView. So remove android:entriesattribute from ListView in xml layout file. It will be work.

看到这里,首先想到的是在addHeaderView之前不要设置adapter,但是实际项目是listView的数据源来回切换的,所以不可能保证adapter一直在addHeaderView 之前,这样,只好在addHeaderView之前清空Adapter;
实际项目中又发现如果这样的话,addHeaderView的内容是显示不出来的,反复调试发现需要在这之后,再将adapter设置上去,才能得到想要的结果,代码如下:


    int currentApiVersion = android.os.Build.VERSION.SDK_INT;
    // 4.3  之前的版本 listView不能在set adapter之后add header
    int limitApiVersion = android.os.Build.VERSION_CODES.JELLY_BEAN_MR2;

    private <T extends ListAdapter>void oldVersionHandle(View header,T mAdapter) {
        // 解决低版本add header 时报错的问题,设置adapter为null
        if (currentApiVersion < limitApiVersion && lvMomentsJudge.getAdapter() != null) {
            DU.s('a', "set adapter null");
            lvMomentsJudge.setAdapter(null);
        }
        lvMomentsJudge.addHeaderView(header, null, false);
        assert mAdapter != null;

        // 必须在add header view 之后再把之前设为null的adapter加上,否则会出现不显示的结果
        lvMomentsJudge.setAdapter(mAdapter);
    }

转载署源:
By-KyleCe
Link:http://blog.youkuaiyun.com/KyleCeshen/article/details/49869481

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值