当前位置: 首页 > news >正文

Adapter Class Cast Exception Removing Footer View from ListView

又好久没写blog了,工作的时候,解决了一些问题,却又觉得时间紧,没空写。习惯需要坚持啊。

今天在做ListView滚动自动加载的时候碰到了Adapter Class Cast Exception Removing Footer View from ListView 问题。


感到很奇怪,怎么会出类型转换错误呢?以前用的时候怎么没碰到?我最开始在想是不是因为此时还没有给listview添加footerview。

但是这也不对啊,那样只会报Null Pointer Exception,看了一下remove的源码:

 public boolean removeFooterView(View v) {
        if (mFooterViewInfos.size() > 0) {
            boolean result = false;
            if (mAdapter != null && ((HeaderViewListAdapter) mAdapter).removeFooter(v)) {
                if (mDataSetObserver != null) {
                    mDataSetObserver.onChanged();
                }
                result = true;
            }
            removeFixedViewInfo(v, mFooterViewInfos);
            return result;
        }
        return false;
    }

系统已经帮我判断了footerview的数量,大于0才会去remove。


于是我又开始猜想,adapter的类型转换异常难道是加了FooterView和没有加FooterView的适配器是不一样的吗?那这个adapter会在哪儿初始化呢?

应该是在listview初始化的时候,于是去打算去看看ListView的setAdapter方法:

public void setAdapter(ListAdapter adapter) {
        if (mAdapter != null && mDataSetObserver != null) {
            mAdapter.unregisterDataSetObserver(mDataSetObserver);
        }

        resetList();
        mRecycler.clear();

        if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {
            mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);
        } else {
            mAdapter = adapter;
        }

        mOldSelectedPosition = INVALID_POSITION;
        mOldSelectedRowId = INVALID_ROW_ID;

        // AbsListView#setAdapter will update choice mode states.
        super.setAdapter(adapter);

        if (mAdapter != null) {
            mAreAllItemsSelectable = mAdapter.areAllItemsEnabled();
            mOldItemCount = mItemCount;
            mItemCount = mAdapter.getCount();
            checkFocus();

            mDataSetObserver = new AdapterDataSetObserver();
            mAdapter.registerDataSetObserver(mDataSetObserver);

            mRecycler.setViewTypeCount(mAdapter.getViewTypeCount());

            int position;
            if (mStackFromBottom) {
                position = lookForSelectablePosition(mItemCount - 1, false);
            } else {
                position = lookForSelectablePosition(0, true);
            }
            setSelectedPositionInt(position);
            setNextSelectedPositionInt(position);

            if (mItemCount == 0) {
                // Nothing selected
                checkSelectionChanged();
            }
        } else {
            mAreAllItemsSelectable = true;
            checkFocus();
            // Nothing selected
            checkSelectionChanged();
        }

        requestLayout();
    }

终于找到原因了,在HeaderView或者FooterView不为空的情况下,会把当前传入的adapter转换为HeaderViewListAdapter。否则会用原有的adapter。

So, the conclusion:

如果出现了Adapter Class Cast Exception Removing Footer View from ListView ,要在调用listview.setAdapter(myadapter);之前,加上addFooterView()或者addHeaderView()



转载于:https://www.cnblogs.com/ameryzhu/p/6555627.html

相关文章:

  • LeetCode--014--最长公共前缀
  • 串口超时处理原理及实现
  • ACM北大暑期课培训第一天
  • Delphi窗体创建释放过程及单元文件小结(转)
  • Linux部署zabbix3.4 结合钉钉智能报警
  • 学生分数排序
  • zabbix3.4上简单web监测功能测试
  • linux系统man查询命令等级与意义
  • 关于ES6的Promise的使用深入理解
  • P1065 津津的储蓄计划
  • 2018年 7月总结8月计划
  • Proteus仿真_01、 8086 IO译码仿真
  • CentOS 7之Postfix部署系列 (二) CentOS网络设置
  • AJAX PHP 请求实例
  • 使用Formik轻松开发更高质量的React表单(二)使用指南
  • JS 中的深拷贝与浅拷贝
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • chrome扩展demo1-小时钟
  • ES10 特性的完整指南
  • exports和module.exports
  • Golang-长连接-状态推送
  • GraphQL学习过程应该是这样的
  • iOS编译提示和导航提示
  • Java知识点总结(JavaIO-打印流)
  • JSDuck 与 AngularJS 融合技巧
  • Just for fun——迅速写完快速排序
  • maya建模与骨骼动画快速实现人工鱼
  • mysql常用命令汇总
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • TCP拥塞控制
  • Vue全家桶实现一个Web App
  • 力扣(LeetCode)22
  • 如何解决微信端直接跳WAP端
  • 如何使用 JavaScript 解析 URL
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 手写一个CommonJS打包工具(一)
  • 微信公众号开发小记——5.python微信红包
  • ​flutter 代码混淆
  • ​Python 3 新特性:类型注解
  • ​插件化DPI在商用WIFI中的价值
  • ​如何在iOS手机上查看应用日志
  • #前后端分离# 头条发布系统
  • #微信小程序:微信小程序常见的配置传旨
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • ()、[]、{}、(())、[[]]命令替换
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (三)c52学习之旅-点亮LED灯