ListView addHeaderView和addFooterView使用上的一些问题

ListView addHeaderView和addFooterView使用上的一些问题

剧情是这样的:

 1 public class SomeViewGroup extends FrameLayout {
 2 
 3         ...
 4 
 5     public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
 6 
 7         mOnLoadMoreListener = onLoadMoreListener;
 8 
 9         LayoutInflater mInflater = (LayoutInflater) getContext()
10                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
11         loadMoreLayout = (ViewGroup) mInflater.inflate(
12                 R.layout.list_load_more_layout, this);
13         loadMoreLayout.setOnClickListener(loadMoreClickListener);
14         loadMoreText = (TextView) loadMoreLayout
15                 .findViewById(R.id.load_more_textview);
16         moreProgressBar = (ProgressBar) loadMoreLayout
17                 .findViewById(R.id.load_more_progressbar);
18         loadMoreText.setVisibility(View.GONE);
19         mainList.addFooterView(loadMoreLayout);
20 
21     }
22 
23         ...
24 
25 }        

关键在红色的那几行,这个view在使用时会发生异常,

java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams

下面来分析下原因和解决方法。

在ListView源码里可以看到:

 1     void resetList() {
 2         // The parent's resetList() will remove all views from the layout so we need to
 3         // cleanup the state of our footers and headers
 4         clearRecycledState(mHeaderViewInfos);
 5         clearRecycledState(mFooterViewInfos);
 6 
 7         super.resetList();
 8 
 9         mLayoutMode = LAYOUT_NORMAL;
10     }
11 
12     private void clearRecycledState(ArrayList<FixedViewInfo> infos) {
13         if (infos != null) {
14             final int count = infos.size();
15 
16             for (int i = 0; i < count; i++) {
17                 final View child = infos.get(i).view;
18                 final LayoutParams p = (LayoutParams) child.getLayoutParams();
19                 if (p != null) {
20                     p.recycledHeaderFooter = false;
21                 }
22             }
23         }
24     }

错误就是在第18行抛出的,这里的 mFooterViewInfos 实际上就是我们添加的Footer view的一个列表。代码里循环处理每个footer view,而在getLayoutParams()时,ListView要求必须是AbsListView的LayoutParams,而在我们自己的代码中:loadMoreLayout = (ViewGroup) mInflater.inflate(R.layout.list_load_more_layout, this),这里的this是FrameLayout,所以才抛出ClassCastException异常的。

解决方法很简单,把我们自己代码中的12行的this改成null就OK了:D

还有一点要注意,addFooterView()一定要在setAdapter()之前调用,否则,虽然不会像addHeaderView()那样抛出异常,但是会导致footer view无法显示。

转载于:https://www.cnblogs.com/coding-way/archive/2013/05/17/3083351.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110129.html原文链接:https://javaforall.net

(0)
上一篇 2021年8月23日 下午11:00
下一篇 2021年8月23日 下午11:00


相关推荐

  • 获取office序列号并删除

    获取office序列号并删除获取 office 序列号并删除以管理员模式打开 CMD 命令提示符 cdoffice 地址 同时获得 lience 的后 5 位 cdC ProgramFiles x86 MicrosoftOff Office16 获取后 5 位 scriptospp vbs dstatus 需要注意空格等内容 随后删除 ospp vbs 的内容 即为前出现的 lience 号 cscriptospp vbs unpkey 注意空格最后可以再观察一次 dstatus 检测是否删除

    2026年3月18日
    2
  • 怎么把python中的列表转化为字符串(python成长记录)

    怎么把python中的列表转化为字符串(python成长记录)怎么把python中的列表转化为字符串(python成长记录)1,列表中非字符串的元素的转换方法一:使用列表推导式转换list1=[‘happy’,1,6,’sad’]list1=[str(i)foriinlist1]print(list1)结果为[‘happy’,’1′,’6′,’sad’]方法二:使用map高级函数转换list1=[‘happy’,1,6,…

    2022年5月30日
    40
  • 程序员私活网汇总

    程序员私活网汇总1 IT 外包 http itwaibao com 2 CODING 码市 https mart coding net3 开源众包 https zb oschina net projects list html4 猪八戒 https zbj com5 程序员客栈 https www proginn com

    2026年3月19日
    3
  • 现在建网站你会选择自己建站还是在线建站平台?

    现在建网站你会选择自己建站还是在线建站平台?一 什么是网站 网上关于网站的定义很多 在此就不想重复了 简而言之网站就是创建者使用技术手段搭建 从而让访客可以通过域名访问并进行互动的互联网页面组合 通常网站由四个部分组成 1 域名 也就是我们通常称为网址的东东 比如 淘宝 taobao com 百度 baidu com 对于普通用户可以简单理解为域名既网址 域名是网站的访问入口 没有域名的话普通用户无法访问网站就好了 所以域名是网站的重要组成部分 2 程序 这里特指建站程序 网站虽然每一个页面都是由源代码组成的 但即使是程

    2025年6月26日
    5
  • 虚拟机桥接模式下设置静态IP地址无法上网

    虚拟机桥接模式下设置静态IP地址无法上网宿主机:win7虚拟机:Fedora24上网:无线路由器+ADSL虚拟机采用桥接模式,之前虚拟机的网卡配置为DHCP模式,通过无线路由器动态分配一个192.168.1.xxx的IP地址,可以上网。由于最近需要虚拟机的IP地址固定,就设置了一个镜头IP地址:192.168.1.30,结果发现虚拟机无法上网了。折腾了半天发现,在vmware的网络编辑器中,不要使用自动,要明确选择桥接到联网的

    2022年6月5日
    57
  • rider 2022 激活-激活码分享2022.01.27

    (rider 2022 激活)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1TCF…

    2022年3月31日
    343

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号