剧情是这样的:
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账号...