原書籍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**”。
