原书籍P177第二段行开始关于LayoutInflater的inflate方法解析,初次看到这里不狠命比,这里做一下总结说明
```
class FruitAdapter(activity: Activity, val resourceId: Int, data: List<Fruit>) : ArrayAdapter<Fruit>(activity, resourceId, data) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view: View
val viewHolder: ViewHolder
if (convertView == null) {
view = LayoutInflater.from(context).inflate(resourceId, parent, false)
val fruitImage: ImageView = view.findViewById(R.id.fruitImage)
val fruitName: TextView = view.findViewById(R.id.fruitName)
viewHolder = ViewHolder(fruitImage, fruitName)
view.tag = viewHolder
} else {
view = convertView
viewHolder = view.tag as ViewHolder
}
val fruit = getItem(position) // 获取当前项的Fruit实例
if (fruit != null) {
viewHolder.fruitImage.setImageResource(fruit.imageId)
viewHolder.fruitName.text = fruit.name
}
return view
}
inner class ViewHolder(val fruitImage: ImageView, val fruitName: TextView)
}
```
上面的重写的getView方法中加载布局XML文件时,调用了inflate方法,
~~~
view = LayoutInflater.from(context).inflate(resourceId, parent, false)
~~~
调用`inflate(int resource, ViewGroup root, boolean attachToRoot)
`,这里作者在第一行代码中这样描述:“第三个参数指定成false,表示只让我们在父布局中声明的layout属性生效,但不会为这个View添加父布局,因为一旦View有了父布局之后,它就不能再添加到ListView中了。”,初始理解起来可能有点晦涩难懂,我们从作者的博客中找到这篇文章[Android LayoutInflater原理分析,带你一步步深入了解View](https://blog.csdn.net/guolin_blog/article/details/12921889),关于inflate方法`inflate(int resource, ViewGroup root, boolean attachToRoot)
`这样说到:
1. 如果root为null,attachToRoot将失去作用,设置任何值都没有意义。
2. 如果root不为null,attachToRoot设为true,则会给加载的布局文件的指定一个父布局,即root。
3. 如果root不为null,attachToRoot设为false,则会将布局文件最外层的所有layout属性进行设置,当该view被添加到父view当中时,这些layout属性会自动生效。
4. 在不设置attachToRoot参数的情况下,如果root不为null,attachToRoot参数默认为true。
即便这样,大家可能觉得还是难懂,那么我们从评论中,看到已经有网友给出了通俗易懂的讲解:“**attachToRoot那里可能有的人看不懂,其实就是如果root!=null,分两种情况讨论, attachToRoot为false的情况下,直接就把LayoutParam设置给了该view,当它在被添加到父容器中才能生效; attachToRoot为true,直接在添加到root的时候就已经生效了; 如果root=null,那该布局文件中指定的布局参数直接被忽略了,没有意义了,因为我们从attachToRoot这个名字也可以看出来,是对root而言的,如果root不存在,那就没有意义了。 还有要使button的布局参数生效的最简单办法是直接把root指定为main_layout的根布局,即` root=(LinearLayout) findViewById(R.id.main_layout);` `layoutInflater.inflate(R.layout.button_layout, root);` 注意这里指定了root之后不需要再调用addview**”。
![](https://img.kancloud.cn/56/a4/56a4890cc352832f16c87934629fe68d_997x141.png)