前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于ListView的那些坑

关于ListView的那些坑

作者头像
PhoenixZheng
发布2018-08-07 16:44:42
3280
发布2018-08-07 16:44:42
举报
Android的兼容性问题

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

ListView的兼容性问题

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

代码语言:javascript
复制
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的代码

代码语言:javascript
复制
public void addHeaderView(View v, Object data, boolean isSelectable) {
    if (mAdapter != null && !(mAdapter instanceof HeaderViewListAdapter)) {
        throw new IllegalStateException("...")

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

代码语言:javascript
复制
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。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android每日一讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Android的兼容性问题
    • ListView的兼容性问题
      • 原因分析
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档