🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
原书籍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)