问题来自:郭霖的《第一行代码》第三版
在第4.5节中关于提升ListView的内容中
原代码:
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view = LayoutInflater.from(context).inflate(resourceId, parent, false)
val fruitImage:ImageView = view.findViewById(R.id.fruitImage)
val fruitName:TextView = view.findViewById(R.id.fruitName)
val fruit = getItem(position)
if(fruit != null){
fruitImage.setImageResource(fruit.imageId)
fruitName.setText(fruit.name)
}
return view
}
书中提出:
- converView为缓存的布局,可以避免多次创建View和findView。
- 在View上使用tag附加数据,可以避免多次使用findViewId()
书中是这样建议的:
inner class ViewHolder(val fruitImage:ImageView,val fruitName:TextView)
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val viewHolder:ViewHolder
val view:View
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)
if(fruit != null){
viewHolder.fruitImage.setImageResource(fruit.imageId)
viewHolder.fruitName.setText(fruit.name)
}
return view
}
我的问题是:
书中,把convertView转成view,又从view中的tag读取出fruitImage和fruitName。
那为什么不直接返回converView就行了,它里面的缓存的fruitImage和fruitName也不会变啊。
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
return if(convertView == null){
val view = LayoutInflater.from(context).inflate(resourceId, parent, false)
val fruitImage:ImageView = view.findViewById(R.id.fruitImage)
val fruitName:TextView = view.findViewById(R.id.fruitName)
val fruit = getItem(position)
if(fruit != null){
fruitImage.setImageResource(fruit.imageId)
fruitName.text = fruit.name
}
view
}else{
convertView
}
}
这样运行起来也没差别,所以我不懂
只是一个写代码的习惯而已,你直接用convertView也没问题,只是你
必须放外面,即使有缓存也得执行一遍