【Android开发】ViewHolder

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
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值