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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • win32中SetCapture 和 ReleaseCapture的使用

    win32中SetCapture 和 ReleaseCapture的使用     最近在用win32写《visualC++经典游戏程序设计》中的扫雷游戏,在写到鼠标点击雷区的时候用到了SetCapture,和ReleaseCapture这对系统函数。那么为什么需要用到鼠标捕获的函数呢?我错误地认为鼠标的跟踪可以由Point进行传值处理,就能实现我想要的功能,但是我却疏忽了如果我的鼠标按下的时候把鼠标移除窗口外面的情况,这种情况的时候鼠标是在外面的,那么当我把鼠标弹起的时候鼠标的位置就不在扫雷窗口里面了,因此我需要在按下鼠标的时候捕获鼠标的位置,这样就解决了鼠标不在窗口里面的

    2022年6月6日
    32
  • 用html设计一个动漫网站_javascript登录

    用html设计一个动漫网站_javascript登录1.前端三门技术学习Web前端技术需要掌握三门基本技术:HTML,CSS,JavaScript:HTML:HTML是网页内容的载体。内容就是网页制作者放在页面上想要用户浏览的信息,可以包含文件、图片、视频等CSS:CSS样式是表现,就像网页的外衣比字体、颜色变化等JavaScript:JavaScript用来实现网页上的特效效果。比如鼠标滑过弹出下拉菜单、鼠标滑过北京颜色改变等本次项目主要是介绍海贼王主题的简介,使用html+css+javascript来制作网站,实现项目的效果;index.h

    2022年8月23日
    8
  • Java volatile的性能分析「建议收藏」

    Java volatile的性能分析「建议收藏」volatile通过内存屏障来实现禁止重排序,通过Lock执行来实现线程可见性,如果我们的程序中需要让其他线程及时的对我们的更改可见可以使用volatile关键字来修饰,比如AQS中的state所以在一个线程写,多个线程读的情况下,或者是对volatile修饰的变量进行原子操作时,是可以实现共享变量的同步的,但是i++不行,因为i++又三个操作组成,先读出值,然后再对值进行+1,接着讲结果写入,这个过程,如果中间有其他线程对该变量进行了修改,那么这个值就无法得到正确的结果。今天我们讨论的重

    2022年7月18日
    17
  • vue django mysql_Python MySQL

    vue django mysql_Python MySQL工作之余断断续续根据网上找到的教程进行环境搭建,搭建了多个。但是一直没有一个整体概念,到底该先做什么,后做什么,操作一步后,结果应该是怎样另外,网上的教程都是直接用命令行操作,用pycharm又应该怎么弄呢环境搭建好以后,应该怎么分目录结构,应该先从哪里的代码开始写,写了以后,又需要做哪些配置这些问题一直困扰着我,所以我决定边学边记录整理。也希望能帮助同为初学者的你少走一些…

    2022年8月28日
    6
  • 【机器学习】几种相似度算法分析

    最近开始研究推荐系统,其中常见的相似度算法有以下几种:1.欧几里得距离欧几里得度量(euclideanmetric)(也称欧氏距离)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。注意事项:a.因为计算是基于各维度特征的绝对数值,所以欧氏度量需要保证各维度指标在相同的刻度级别,比如对身高…

    2022年4月4日
    46
  • IDEA使用ideaVim, 配置自定义vim快捷键[通俗易懂]

    IDEA使用ideaVim, 配置自定义vim快捷键[通俗易懂]C:\Users\Administrator文件夹下创建_ideavimrc,我这里用的是win系统需要安装ideaVim插件letmapleader=”sethlsearchsetincsearchsetignorecasesetsmartcasesetshowmodesetnumbersetrelativenumbersetscrolloff=…

    2022年10月1日
    3

发表回复

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

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