在一般项目中使用adapter时,加载item布局咱们一般会使用:
LayoutInflater.from(context).inflate(R.layout.list_item, null);
但这样你会发现编译器不希望你这样:Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout's root element)
而且你的xml的最外层布局的一些对于其父布局的一些诉求属性,不管怎么设置都不起作用。
比如这样一个item布局:
用上述方法加载后结果发现
android:layout_height="50dp"
android:layout_margin="50dp"
这两句没有效果。
so,咱们来研究一下。
网上流传了这样一篇文章,
这是一个老外对inflate()的研究。
其实他有很多个方法,但查看源码这些方法都殊途同归。
我现在就说一下inflate(int resource, ViewGroup root, boolean attachToRoot)
第一个参数无需过多解释。
第二个参数指的是加载布局的root
Optional 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 (ifattachToRoot is false.)
大概就是说如果后面attachToRoot为true的情况下,这个布局会被解析并加载在root下面,如果为false,则会依照root去解析该xml并返回view,但是这个view不会被加载到root里。
其实如果为false,就是讲xml解析了,并依照root的类型给生成的view set一个LayoutParams ,但不将其add到root里。
然后咱们看源代码里
LayoutInflater.from(context).inflate(R.layout.list_item, null);
这个其实 是这样调用的:
public View inflate(int resource, ViewGroup root) {
return inflate(resource, root, root != null);
}
所以我建议将其写为
LayoutInflater.from(context).inflate(R.layout.list_item,root,false);
root就是加载这个view的父布局。
然后再在listview的adapter试一下,
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(
R.layout.list_item, parent, false);
}
return convertView;
}
发现在listview里加载item的布局,
android:layout_height="50dp"
这句已经起到作用,但layout_margin无效果。
这是因为在listview里,convertview用的是viewgroup的 LayoutParams,所以线性布局的一些属性,例如layout_margin在解析的时候不起作用的。
为了验证一下,咱们在linearlayout中实验一下LayoutInflater
layout=(LinearLayout)findViewById(R.id.layout1);
View view=LayoutInflater.from(this).inflate(R.layout.list_item,layout , false);
layout.addView(view);
奥,对了,注意,在listview中不要将inflate(int resource, ViewGroup root, boolean attachToRoot)的attachToRoot设为true,
因为这样等于说让listview addview(convertView),但是listview不能加子控件,会报如下错误:
java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView
View view=LayoutInflater.from(this).inflate(R.layout.list_item,layout , false);
layout.addView(view);
最后附上demo下载地址http://download.csdn.net/detail/ccfcccfc/8142913点击打开链接