LayoutInflater.inflate()方法异常:仅最后一项数据正常显示
问题根源:LayoutInflater.inflate的attachToRoot参数用错了
你代码里的核心问题是对LayoutInflater.inflate第三个参数attachToRoot的理解有误:
- 当你把
attachToRoot设为true时,系统会直接把解析出来的item布局(model_layout的根视图)添加到传入的父容器linearLayout中,并且返回的是父容器本身,不是你刚加载的item布局。 - 你误以为
item变量是刚创建的item视图,于是直接调用item.findViewById操作控件,但实际上item是binding.linearContainer这个父容器。这时候每次查找控件,都是在父容器的所有子View里找第一个匹配id的控件——但你循环添加了多个item,每个item里都有相同id的TextView,导致你每次设置的都是同一个(通常是第一个item里的)控件,而最后一次循环时,刚好命中了最后一个item的控件,所以只有它显示正确,前面的item因为没被正确赋值,保持了XML默认值。
两种正确写法
写法1:保持attachToRoot为true,手动获取刚添加的item
既然inflate已经把item加到父容器了,直接取父容器的最后一个子View就是刚添加的item:
private fun addModelToView(model: Model) { val linearLayout = binding.linearContainer // inflate并自动添加到父容器,返回值是linearLayout(父容器) activity?.layoutInflater?.inflate(R.layout.model_layout, linearLayout, true) // 获取父容器最后一个子View,也就是刚添加的item val item = linearLayout.getChildAt(linearLayout.childCount - 1) // 给item里的控件赋值 item?.findViewById<TextView>(R.id.textView10)?.text = model.name item?.findViewById<TextView>(R.id.textView11)?.text = model.company item?.findViewById<TextView>(R.id.textView12)?.text = model.size.toString() }
写法2:attachToRoot设为false,手动添加到父容器(你已经验证过的正常写法)
这种方式逻辑更清晰,先加载布局但不自动添加,赋值后再手动加入父容器:
private fun addModelToView(model: Model) { val linearLayout = binding.linearContainer // attachToRoot设为false,返回值是刚加载的item布局 val item = activity?.layoutInflater?.inflate(R.layout.model_layout, linearLayout, false) // 给item控件赋值 item?.findViewById<TextView>(R.id.textView10)?.text = model.name item?.findViewById<TextView>(R.id.textView11)?.text = model.company item?.findViewById<TextView>(R.id.textView12)?.text = model.size.toString() // 手动添加到父容器 item?.let { linearLayout.addView(it) } }
内容的提问来源于stack exchange,提问作者gemy845
相关产品推荐
相关产品推荐

