在使用RecycleView
的时候,添加item布局文件之后,发现显示效果并没有像自己想的那样“match_parent”,而是
后面的居然显示不完全。
查了下,发现自己
inflate
的姿势不对:(我原来这么写
View view = View.inflate(viewGroup.getContext(), R.layout.activity_row_question, null);
)
The docs for inflate:
Inflate a new view hierarchy from the specified xml resource. Throws InflateException if there is an error.
Parameters
resource ID for an XML layout resource to load (e.g., R.layout.main_page) root view to be the parent of the generated hierarchy (if attachToRoot is true), or else simply an object that provides a set of LayoutParams values for root of the returned hierarchy (if attachToRoot is false.)
attachToRoot Whether the inflated hierarchy should be attached to the root parameter? If false, root is only used to create the correct subclass of LayoutParams for the root view in the XML. Returns The root View of the inflated hierarchy. If root was supplied and attachToRoot is true, this is root; otherwise it is the root of the inflated XML file.
It is important here to not supply true, but do supply the parent:
LayoutInflater.from(parent.getContext()) .inflate(R.layout.card_listitem, parent, false);
(英文不太好,上面看不太懂(⊙﹏⊙)b)后来,我又在网上找到了郭霖大神的一篇文章:Android LayoutInflater原理分析,带你一步步深入了解View(一),里面有这么一段:
比较细心的朋友也许会注意到,inflate()方法还有个接收三个参数的方法重载,结构如下:
inflate(int resource, ViewGroup root, boolean attachToRoot)
那么这第三个参数attachToRoot又是什么意思呢?其实如果你仔细去阅读上面的源码应该可以自己分析出答案,这里我先将结论说一下吧,感兴趣的朋友可以再阅读一下源码,校验我的结论是否正确。
- 如果root为null,attachToRoot将失去作用,设置任何值都没有意义。
- 如果root不为null,attachToRoot设为true,则会给加载的布局文件的指定一个父布局,即root。
- 如果root不为null,attachToRoot设为false,则会将布局文件最外层的所有layout属性进行设置,当该view被添加到父view当中时,这些layout属性会自动生效。
- 在不设置attachToRoot参数的情况下,如果root不为null,attachToRoot参数默认为true。