在一般项目中使用adapter时,加载item布局咱们一般会使用:
[html]view plaincopy
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布局:
[html]view plaincopy
android:layout_width="fill_parent" android:layout_height="50dp" android:layout_margin="50dp" android:gravity="center" android:orientation="horizontal"> android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView1"/> android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView2"/> LinearLayout> 用上述方法加载后结果发现 [html]view plaincopy android:layout_height="50dp" android:layout_margin="50dp" 这两句没有效果。 so,咱们来研究一下。 网上流传了这样一篇文章, http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ 点击打开链接 这是一个老外对inflate()的研究。 其实他有很多个方法,但查看源码这些方法都殊途同归。 我现在就说一下inflate(int resource, ViewGroup root, boolean attachToRoot) 第一个参数无需过多解释。 第二个参数指的是加载布局的root Optional view to be the parent of the generated hierarchy (ifattachToRootis true), or else simply an object that provides a set of LayoutParams values for root of the returned hierarchy (ifattachToRootis false.) 大概就是说如果后面attachToRoot为true的情况下,这个布局会被解析并加载在root下面,如果为false,则会依照root去解析该xml并返回view,但是这个view不会被加载到root里。 其实如果为false,就是讲xml解析了,并依照root的类型给生成的view set一个LayoutParams,但不将其add到root里。 然后咱们看源代码里 [html]view plaincopy LayoutInflater.from(context).inflate(R.layout.list_item,null); 这个其实 是这样调用的: [java]view plaincopy publicViewinflate(intresource,ViewGrouproot){ returninflate(resource,root,root!=null); } 所以我建议将其写为 [java]view plaincopy LayoutInflater.from(context).inflate(R.layout.list_item,root,false); root就是加载这个view的父布局。 然后再在listview的adapter试一下, [java]view plaincopy @Override publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ if(convertView==null){ convertView=LayoutInflater.from(context).inflate( R.layout.list_item,parent,false); } returnconvertView; } 发现在listview里加载item的布局, [html]view plaincopy android:layout_height="50dp" 这句已经起到作用,但layout_margin无效果。 这是因为在listview里,convertview用的是viewgroup的LayoutParams,所以线性布局的一些属性,例如layout_margin在解析的时候不起作用的。 为了验证一下,咱们在linearlayout中实验一下LayoutInflater [java]view plaincopy layout=(LinearLayout)findViewById(R.id.layout1); Viewview=LayoutInflater.from(this).inflate(R.layout.list_item,layout,false); layout.addView(view); 这样的话设置宽高和设置layout_margin都起到了作用。因为这时候view的layoutParams是LinearLayout.layoutParams的缘故,所以layout_margin果断会起到效果。 奥,对了,注意,在listview中不要将inflate(int resource, ViewGroup root, boolean attachToRoot)的attachToRoot设为true, 因为这样等于说让listview addview(convertView),但是listview不能加子控件,会报如下错误: [html]view plaincopy java.lang.UnsupportedOperationException:addView(View,LayoutParams)isnotsupportedinAdapterView 而在linearlayout里可以将inflate(int resource, ViewGroup root, boolean attachToRoot)的attachToRoot设为true,这样就相当于 [java]view plaincopy Viewview=LayoutInflater.from(this).inflate(R.layout.list_item,layout,false); layout.addView(view); 最后附上demo下载地址http://download.csdn.NET/detail/ccfcccfc/8142913点击打开链接 转自:http://blog.sina.com.cn/s/blog_7d95a2e70102v9xr.html,thanks