我遇到的问题的场景是这样的,recycleview加载图片,然后给recycleview添加一个头部视图,但是运用的过程中发现在xml中并不能很好地控制头部视图的高度,然后准备在代码中动态设置它的宽高,但是问题出现了,不知道什么情况,代码却一直报空指针。
这是代码
RelativeLayout.LayoutParams params= (RelativeLayout.LayoutParams) mHeaderView.getLayoutParams(); params.height=100; mHeaderView.setLayoutParams(params);这是错误异常
刚开始觉得可能是导入的jar包不对不对,然后又切换为引用ViewGroup下的LayoutParams,发现依然没有什么卵用。
后来去网了搜了一下问题的原因,也没有搜出个所以然,很是头疼,不过却无意间看到了有关动态修改高度的另一种写法,就改成了这种的。
RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams (RelativeLayout.LayoutParams.MATCH_PARENT, 100); mHeaderView.setLayoutParams(params);然后又运行了一遍,发现app能运行了!很是意外,但是我们的目的并不是让代码能运行就可以了,还要搞清楚问题的原因,不然下次遇到还是会犯错!
后来我又分析了一下,既然
params.height= DensityUtil.dip2px(PostActivity.this, 200);这一行报空指针,肯定是getLayoutParams()得到的对象为空,但是这里怎么可能会为空呢,这里只是简单地get一下params,所以不可能是问题产生的地方,xml也没有任何问题,那出现问题的地方地方只有布局填充的时候了。
然后我再检查代码的时候发现了这么一个字段
headView = LayoutInflater.from(this).inflate(R.layout.post_head_view, null);第一个是xml文件资源,可是第二个参数null是个什么鬼!然后就去api查了下这个参数的介绍,说这个参数是root参数,也就是父母局,如果这个参数为null,那么在 getLayoutParams()的时候就报空指针的错误,如果不为空填充布局就返回这个root。那么这个地方,这个root参数到底该怎么写呢,这是问题的重点。
后来又研究了一下,根据个人理解,一般一个view是继承view的时候这个字段才会填写,将null改成它的父布局,但是这里并不是继承的view,所以这个参数也根本用不到,既然为空就有解决的办法,后来看了下源码,有这么一段说法
/** * Measure a particular list child.
* TODO: unify with setUpChild.
* @param child The child.
*/ private void measureItem(View child) {
ViewGroup.LayoutParams p = child.getLayoutParams();
**if (p == null) {
p = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}**
.............. }
既然这样这里就有办法解决了。可以这样在getlayoutParams()的时候在上一个判断。
//这里是headview防止为空加的处理 if (mHeaderView.getLayoutParams() == null) { mHeaderView.setLayoutParams(new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); } ViewGroup.LayoutParams params=mHeaderView.getLayoutParams(); params.height= DensityUtil.dip2px(PostActivity.this, 200); mHeaderView.setLayoutParams(params);
这样问题就解决了!这里做一下分享,希望能帮到大家。