ViewHolder通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能
class MyAdapter(private val list: List<Msg>, private val ctx: Context) : BaseAdapter() {
override fun getCount(): Int {
return list.size
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
var view: View? = convertView
val holder: ViewHolder
if(convertView == null){
Log.e("MYMSG", "=====$position")
//优化1:利用进入RecycleBin中的View,减少读view的赋值
view = LayoutInflater.from(ctx).inflate(R.layout.item4, null) //?
holder = ViewHolder()
holder.profile = view.findViewById(R.id.profile)
holder.nickname = view.findViewById(R.id.nickname)
holder.content = view.findViewById(R.id.content)
holder.like = view.findViewById(R.id.like)
holder.comment = view.findViewById(R.id.comment)
holder.repost = view.findViewById(R.id.repost)
view.tag = holder
}else {
//通过getTag()取出ViewHolder对象,然后能过直接通过holder.控件的方式在外面直接操作控件
//从而避免了大幅度使用findViewById操作
//而事实上,getTag()本身操作效率高
holder = view?.tag as ViewHolder
}
val msg = list[position]
holder.profile!!.setImageResource(msg.profile)
holder.nickname!!.text = msg.nickname
holder.content!!.text = msg.content
if (msg.isLike) {
holder.like!!.setImageResource(R.mipmap.liked)
} else {
holder.like!!.setImageResource(R.mipmap.like)
}
holder.comment?.setOnClickListener { Toast.makeText(ctx, "你点击了评论", Toast.LENGTH_SHORT).show() }
holder.repost?.setOnClickListener {Toast.makeText(ctx, "----------转发----------", Toast.LENGTH_SHORT).show()}
return view
}
override fun getItem(position: Int): Any? {
return null
}
override fun getItemId(position: Int): Long {
return 0
}
//1.自定义一个类,叫做ViewHolder
//2.将需要保存的视图声明为公开的属性
//3.什么时候保存?当view为null时,完成对ViewHolder的实例化工作,并为各个控件属性赋值
//4.什么时候用? 什么时候都要用(性能的提升是在view不为null时体现,滚动ListView时体现)
//5.怎么用?当view为null时,完成了ViewHolder及内部控件属性的初始化工作后,调用一句代码
//view.setTag(holder);
//当view不为null时,holder = view.getTag();
internal class ViewHolder {
var profile: ImageView? = null
var like: ImageView? = null
var comment: ImageView? = null
var repost: ImageView? = null
var nickname: TextView? = null
var content: TextView? = null
}
}