布局加载器LayoutInflater讲解

来源:互联网 发布:百度统计 数据 编辑:程序博客网 时间:2024/05/18 06:54

第一次写博客博客有些小激动啊,嘿嘿微笑微笑,话不多说直接上代码

一般我们写代码中用布局加载器加载常用的就是这三种方式,第三种应该大家都知道这里就不说了,而主要问题就集中在第一种和第二种方法的区别、



那我们直接来看第一个和第二个方法

这里我先给出这两种方式在作为listview或者recyclerviewitem 的时候显示结果,稍后再解释为啥会这样


以recyclerview为例

第一种

加载item 的时候条目根布局的宽高设置无效,直接为wrap_content如下图


第二种

加载item 的时候条目根布局宽高设置的dp有效,宽度match_parent有效,高度设置match_parent无效高度显示为wrap_content如下

看了效果想必大家很疑惑为什么两种加载方式会有如此大的区别,为了搞清原因那我们就从源码中一探究竟、


第一种

源码对应如下


第二种

源码对应如下

最后这两个方法都走了这个方法里面

这个方法里面我们只要看关键的这几步就好了

这个方法是根据之前的布局id生成一个Viewtemp,然后如果root != null并且 attachToRootfalse的时候给temp设置params,而这个params值就是xml中自己设置的值, 父容器只影响viewLayoutParams的类型,注意不影响具体数值.


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 


所以

一般情况下推荐使用第二种方式加载布局


14 0