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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • minhash算法_小k

    minhash算法_小k对于web网页去重的应用,如抄袭、镜像等,通过将网页表示为字符k-grams(或者k-shingles)的集合,把网页去重的问题转化为找到这些集合的交集。使用传统的方法存储这些巨大的集合以及计算它们之间的相似性显然是不够的,为此,对集合按某种方式进行压缩,利用压缩后的集合推断原来集合的相似性。 Jaccard相似性:只关注集合之间的交集大小。集合S和T的Jaccard相似性定义如下:

    2022年10月30日
  • springmvc之@PathVariable 注解

    springmvc之@PathVariable 注解springmvc之@PathVariable 注解

  • div:给div加滚动条 div的滚动条设置

    div:给div加滚动条 div的滚动条设置
    今天做了个例子:
    div的滚动条问题:
    两种方法:
    一、

    记住宽和高一定要设置噢,否则不成的

    不过在不超出时,会有下面的滚动条,所以不是最好的选择
     
    二、

  • poj1146

    poj1146题目链接:http://poj.org/problem?id=1146题目大意:求一个字符串的后继字符串,即对一个字符串进行字典序排列的后一个!方法:对字符串进行从后向前进行遍历,如果直到找到后面的最大的非递增序列,然后在这个序列中找到比其前面大的最小的一个字母和其交换,再对交换后的后面的部分进行字典序排列再次进行输出即可以拉!#include#includeusingnam

  • CAN通信详解(全)

    本章我们将向大家介绍如何使用STM32自带的CAN控制器来实现两个开发板之间的CAN通讯,并将结果显示在TFTLCD模块上。本章分为如下几个部分:30.1CAN简介30.2硬件设计30.3软件设计30.4下载验证30.1CAN简介CAN是ControllerAreaNetwork的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在当前的汽车产业中,出于对安全…

发表回复

您的电子邮箱地址不会被公开。

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