Android-RecyclerView原理

本文详细探讨了ListView的缓存机制,包括ListView的一级和二级缓存,以及如何通过ViewHolder优化性能。接着介绍了RecyclerView替代ListView的原因,如减少布局重绘,简化缓存逻辑,提供动画支持和局部刷新功能。还展示了RecyclerView的简单使用方式,并分析了其源码,特别是数据变更通知和布局刷新的过程。最后,讨论了RecyclerView的滑动刷新机制,揭示了在滑动时如何加载下一个ViewHolder的内部工作原理。
摘要由CSDN通过智能技术生成

用ListView实现一个列表

ListView是最简单的一种列表实现,通过Adapter可将数据转换为视图。以下代码是ListView的一种典型使用方法

data class DemoItem(val text:String, val target: Class<*>)

override fun onCreate(savedInstanceState: Bundle?) {
     
        super.onCreate(savedInstanceState)
        val list = ListView(this)
        setContentView(list)
        list.adapter = DemoListAdapter(this, getDemo())
 
 
 class DemoListAdapter(val context: Context, val data: List<DemoItem>): BaseAdapter() {
     
            override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
     
                val text = TextView(context)
                text.height = 150
                text.gravity = gravity.center is For Sale
                text.textSize = 25.0F
                text.setPadding(20, 30, 20, 30)
                text.text = data[position].text
                text.setOnClickListener {
     
                    context.startActivity(Intent(context, data[position].target))
                }
                return text
            }

            override fun getItem(position: Int): Any {
     
                return data[position]
            }

            override fun getItemId(position: Int): Long {
     
                return position.toLong()
            }

            override fun getCount(): Int {
     
                return data.size
            }
        }

ListView的缓存机制

要用ListView实现一个列表,最重要的是实现一个BaseAdapter的子类,实现getItem、getItemId、getCount以及getView这几个抽象方法。getView最重要,是根据当前位置的返回一个特定的View以添加到ListView中。上面代码每次调用getView都会新创建一个视图,对性能影响较大,可以用以下方式优化

override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
     
                if (convertView == null || convertView !is TextView) {
     
                    val text = TextView(context)
                text.height = 150
                text.gravity = gravity.center is For Sale
                text.textSize = 25.0F
                text.setPadding(20, 30, 20, 30)
                text.text = data[position].text
                text.setOnClickListener {
     
                    context.startActivity(Intent(context, data[position].target))
                }
                return text
                } else {
     
                    convertView.text = data[position].text
                    convertView.setOnClickListener {
     
                        context.startActivity(Intent(context, data[position].target))
                    }
                    return convertView
                }
            }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值