第一次写博客博客有些小激动啊,嘿嘿,话不多说直接上代码
一般我们写代码中用布局加载器加载常用的就是这三种方式,第三种应该大家都知道这里就不说了,而主要问题就集中在第一种和第二种方法的区别、
那我们直接来看第一个和第二个方法
这里我先给出这两种方式在作为listview或者recyclerview的item 的时候显示结果,稍后再解释为啥会这样
以recyclerview为例
第一种
加载item 的时候条目根布局的宽高设置无效,直接为wrap_content如下图
第二种
加载item 的时候条目根布局宽高设置的dp有效,宽度match_parent有效,高度设置match_parent无效高度显示为wrap_content如下
看了效果想必大家很疑惑为什么两种加载方式会有如此大的区别,为了搞清原因那我们就从源码中一探究竟、
第一种
源码对应如下
第二种
源码对应如下
最后这两个方法都走了这个方法里面
这个方法里面我们只要看关键的这几步就好了
这个方法是根据之前的布局id生成一个View为temp,然后如果root != null并且 attachToRoot为false的时候给temp设置params,而这个params值就是xml中自己设置的值, 父容器只影响view的LayoutParams的类型,注意不影响具体数值.
root.generateLayoutParams(attrs);这个方法如下
后面再走着两个方法
只有root != null 并且 attachRoot为true的时候才会把布局加到root上
而当root == null 或者 attachToRoot 为 false 该方法就直接返回了temp,
看完了这些我们再来分析上面两种加载方式为啥效果不同
第一个方法 root == null
直接返回了根据xml生成的view而没有添加layoutParams,而又因为view默认的LayoutParams为wrap_content所以,第一种方式无论怎么设置宽高都是包裹内容
第二种方式
root != null 并且 attach == false
直接返回的就是根据xml生成的view,并且设置了根据xml生成的对应数值的LayoutParams,所以这个设置dp就是有效的,而高度之所以设置match_parent没效果因该跟ListView的特性有关,应该是不允许高度设置match_parent
所以
一般情况下推荐使用第二种方式加载布局