关于ListView的那些坑

Android的兼容性问题

做过Android的同学应该都有适配安卓兼容性的问题,今天我们来说一个常见却又经常被忽略的问题。

ListView的兼容性问题

可能很多同学有被ListView坑过的经验,好端端的代码只有在4.0机型上才有奇怪的崩溃问题。 做app开发的应该都知道,ListView在4.0及以前的系统上,必须现在 setAdapter 之前 addHeaderView,否则会导致崩,而这问题在4.4之后就不存在了。

UserAdapter adapter = new UserAdapter();
listView.setAdapter(adapter);
View headerView = View.inflate(this, R.layout.list_header, null);
listView.addHeaderView(headerView);

例如这段代码一运行就报崩溃

java.lang.IllegalStateException: Cannot add header view to list

解决办法是在 setAdapter 之前调用 addHeaderView

原因分析

我们可以看看4.0的addHeaderView的代码

public void addHeaderView(View v, Object data, boolean isSelectable) {
    if (mAdapter != null && !(mAdapter instanceof HeaderViewListAdapter)) {
        throw new IllegalStateException("...")

而4.4及以后的代码则变成了

public void addHeaderView(View v, Object data, boolean isSelectable) {
    ....
    // Wrap the adapter if it wasn't already wrapped.
    if (mAdapter != null) {
        if (!(mAdapter instanceof HeaderViewListAdapter)) {
            wrapHeaderListAdapterInternal();

以后在面试时如果被问到,就知道什么原因啦! 不过还是建议不要用ListView,毕竟它在复杂场景下的扩展性相当弱鸡..能用RecyclerView代替的话推荐RecyclerView。

原文发布于微信公众号 - Android每日一讲(gh_f053f29083b9)

原文发表时间:2018-03-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏everhad

[异常特工]android常见bug跟踪

前言 对app的线上bug的收集(友盟、云捕等)有时会得到这样的异常堆栈信息:没有一行代码是有关自身程序代码的。这使得对bug的解决无从下手,根据经验,内存不足...

2035
来自专栏函数式编程语言及工具

Akka(31): Http:High-Level-Api,Route rejection handling

   Route 是Akka-http routing DSL的核心部分,使用户能比较方便的从http-server的角度筛选http-request、进行se...

2517
来自专栏Android开发指南

11.菜单界面、详情界面

2957
来自专栏何俊林

直播项目之仿全民TV(已开源)

前言:成印昨天发布了他最近闭关10天,开发的一个直播开源项目,我体验了下,觉得还不错,推荐给大家,点击文末【阅读原文】,可访问项目的github地址,觉得不错,...

3518
来自专栏james大数据架构

在Android中调用WebService

某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查。我个人不推荐这...

2645
来自专栏Winter漫聊技术

Android : 四行代码,优雅返回

为了防止用户误触返回键,还在使用 “再按一次退出” 吗? 追求简约与极速的时代,这种交互显然已经Out了嘛~

1442
来自专栏developerHaoz 的安卓之旅

手把手教你从零开始做一个好看的 APP - Day five

本文为 手把手教你从零开始做一个好看的 APP - Day five ,如果想看该系列的其他文章,请点击以下连接

1082
来自专栏何俊林

Android中如何实现无缝切码流

1、通常一种切换码流方式,如系统播放器切换码流,先Stop,再Create Player,再onPrepare,再Start

1733
来自专栏Android 开发学习

PagerAdapter闪屏坑的修复

2952
来自专栏何俊林

Android Multimedia框架总结(二十三)MediaCodec补充及MediaMuxer引入(附案例)

前言:前面几章都是分析MediaCodec相关源码,有收到提问,说MediaCodec到底是硬解码还是软解码?看下今天的Agenda: MediaCodec到...

33110

扫码关注云+社区

领取腾讯云代金券