今天在用listView时遇到这个问题。
网络一些解释
1.
java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
FrameLayout的父控件是一个LinearLayout控件,问题出在,LinearLayout为子控件分配空间的时候,获取FrameLayout的LayoutParams的必须为LinearLayout.LayoutParams,而非FrameLayout.LayoutParams。
简单的举个栗子说明一下:最外层有ReLativeLayout A,里面有两个LinearLayout B、C,而B中又有一个一个FrameLayout D。如果要在代码里设置B的LayoutParams,B的LayoutParams要为RelativeLayout.LayoutParams。
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
B.setLayoutParams(params);
而D要设置的话,需要:
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0);
params.weight = 8;
D.setLayoutParams(params);
2
不同Layout,对应不同Layoutparameter,那么被嵌套的布局或者view,要尊用父布局的Layoutparameter类。
因为你的这个LinearLayout是放在一个ListView中(ListView是AbsListView的子类),所以LinearLayout.setLayoutParameters()中应该放AbsListView.LayoutParameter这个类的对象。 相关Bug:
1)java.lang.ClassCastException: android.widget.LinearLayout LayoutParamscannotbecasttoandroid.widget.RelativeLayout LayoutParams
:这段话提示我们不能将Linear LayoutParams强制转换成RelativeLayout LayoutParams
2):java.lang.ClassCastException: android.widget.LinearLayout LayoutParamscannotbecasttoandroid.widget.AbsListView LayoutParams
在DDMS里面也没有具体定位哪里错了,逐步调试在return那里出错了,求解?
——解决方案——————–
LinearLayout.LayoutParams _llp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.MATCH_PARENT);
这句代码导致的错误哦
——解决方案——————–
因为你的这个LinearLayout是放在一个ListView中(ListView是AbsListView的子类),所以LinearLayout.setLayoutParameters()中应该放AbsListView.LayoutParameter这个类的对象。
3
当发生这种状况。。。。,eclipse得到的异常就在你listView.setAdapter(adapter);这句话中。。。你怎么看listView和adapter都没有空值,正纳闷时
你应该要考虑一下被你添加的FooterView或者HeaderView是否为null,因为空的话。。。ListView就无法测量高度。。。然后无法布局。。最后就报错了。。。还有addFooterView和addHeaderView这两个方法一定要放在
listView.setAdapter(adapter);前面,要不然死活都不会出现你想要的FooterView或者HeaderView;
看来看去只有第三种情况和我的比较符合。于是看了下设置footView的地方。发现原来footView我是在fragment的
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState)方法中写的,用的是方法自带的inflate调用的是
inflate(int resource, ViewGroup root, boolean attachToRoot)
用的是onViewCreate自带的viewGroup做第二个参数。最后导致得到的footView是null.
正确方法调用
inflate
(
int
resource
,
ViewGroup root)方法第二个参数设置成null
.或者调用上面的三个参数的方法,第二个参数也设置成null,第三个参数设置成false,也许也可以。