首页 > 其他分享 >Android ListView运行效率优化

Android ListView运行效率优化

时间:2023-06-28 17:46:30浏览次数:40  
标签:val fruitName fruit convertView Android ListView 效率 view

上篇介绍了ListView的用法,链接如下,这篇主要讲解如何提升ListView的效率

Android 定制ListView的界面

1、使用缓存布局

ListView如果不进行优化,其运行效率是很低的,因为在Adapter类的getView方法中,每次都将布局重新加载一遍,当ListView快速滚动时,这就会成为性能瓶颈。

Adapter类的getView方法有一个参数:View convertView,这个参数用于将之前加载好的布局进行缓存,以便之后进行重用,我们可以借助这个参数进行性能优化。

class FruitAdapter(activity: Activity, private val resourceId: Int, data: List<Fruit>):
    ArrayAdapter<Fruit>(activity, resourceId, data) {

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        Log.d("FruitAdapter", "convertView: $convertView ")
        val view = convertView ?: LayoutInflater.from(context).inflate(resourceId, parent, false)
        val imageView = view.findViewById<ImageView>(R.id.fruitImage)
        val fruitName: TextView = view.findViewById(R.id.fruitName)
        val fruit = getItem(position)
        if (fruit != null) {
            imageView.setImageResource(fruit.imageId)
            fruitName.text = fruit.name
            Log.d("FruitAdapter", "name: ${fruit.name}   position: $position")
        }
        return view
    }
}

其中标红的代码就是优化后的逻辑。如果convertView 为空,则使用LayoutInflater去加载布局,如果不为空,则直接对convertView进行重用。这样就大大提高了ListView的运行效率,在快速滚动的时候可以表现出更好的性能。

2、使用ViewHolder优化findViewById

虽然现在不会重复加载布局,但是每次在getView方法中仍然会调用View的findViewById()方法来重复获取控件的实例。这也是比较消耗性能的操作。

对此我们可以使用ViewHolder来对这部分性能进行优化。

class FruitAdapter(activity: Activity, private val resourceId: Int, data: List<Fruit>):
    ArrayAdapter<Fruit>(activity, resourceId, data) {

    inner class ViewHolder(val fruitImage: ImageView, val fruitName: TextView)

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        Log.d("FruitAdapter", "convertView: $convertView ")
        val view: View
        val viewHolder: ViewHolder
        if (convertView == null) {
            view = LayoutInflater.from(context).inflate(resourceId, parent, false)
            val imageView = view.findViewById<ImageView>(R.id.fruitImage)
            val fruitName: TextView = view.findViewById(R.id.fruitName)
            viewHolder = ViewHolder(imageView, 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.text = fruit.name
        }
        return view
    }
}

我们新增了一个内部类ViewHolder,用于对ImageView和TextView的控件实例进行缓存(Kotlin中使用inner class关键字来定义内部类)。

使用View的setTag()方法来对ViewHolder进行保存,这样在缓存存在的情况下,没有必要每次通过findViewById来获取控件实例了。

通过这两步优化后,ListView的运行效率就已经非常不错了。

 

标签:val,fruitName,fruit,convertView,Android,ListView,效率,view
From: https://www.cnblogs.com/shibin90/p/17512070.html

相关文章

  • 讯飞离线语音合成新版(Aikit)-android sdk合成 demo(Java版本)
    前言:科大讯飞的新版离线语音合成,由于官网demo是kt语言开发的,咱也看不懂kt,搜遍了全网也没看到一个java版的新版离线语音demo,现记录下,留给有缘人参考!!!!!毕竟咱在这上面遇到了不少的坑。如果能留言指正,那就更好了。第一步:​ 官网注册账号---》实名认证---》点击语音合成---》离线语音......
  • android ninepatch
    简介ninepatch是android提供的一种图片格式,以.9.png结尾,它可以根据实际情况横向或纵向的拉伸,它是png的一种特殊格式。ninepatch为什么会有ninepatch呢?比如,有个聊天图片message_left.png,当宽度设置为match_parent时,就产生了图片由于拉伸而很难看的问题。有鉴于此,android在它的sdk......
  • 直播平台怎么搭建,Android获取文本的宽度和高度
    直播平台怎么搭建,Android获取文本的宽度和高度方法一:先绘制文本所在的矩形区域,再获取矩形区域的宽度   Rectrect=newRect();  mPaint.getTextBounds(text,0,text.length(),rect);  canvas.drawRect(rect,mPaint);  floattextWidth1=rect.width(); ......
  • Android 小白在两年时间成为一个大牛,我究竟做了什么?
    初识Android=========“同学们,给大家介绍一下,我是你们未来一年的移动互联网开发讲师”,我在大三的时候,这是我和Android第一次交流,当时的课讲实话,我没听,一点都没有,只是知道了有个东西叫Android开发。还是和大多数人一样,做着自己喜欢的事情。我们专业并不是和移动开发相关的,这点......
  • Android:知道类加载过程面试还是卡壳?硬核总结,一网打净“类”的基础知识
    前言之前说了类加载的过程,但是有的读者表示还是有些面试题还是答不来,所以今天就来总结下类加载、对象实例化方面的知识点/面试题,帮助大家加深印象。全是干货,一网打尽类的基础知识!先看看下面的问题都能回答上来吗?描述new一个对象的过程,并结合例子说明。类初始化的触发时机。多线程进......
  • 2023年最新Android Framework源码高级笔记+学习路线图+硬核资料库,跪着啃完了。。。
    虽然疫情已经过去,餐饮、旅游一些实体经济迅速回暖,但是互联网的寒冬却还没有过去,很多大厂都在裁员,裁员比例还挺高,我们一千多人的公司就直接裁掉30%。今年的各大公司基本只有两个目标:一个是营收,那些投入产出比不高的项目或者事情都暂时搁置,可做可不做的就不做;另外一个就是降本增效,通......
  • 渣渣二本的辛酸面试之路:从深圳外包到杭州蚂蚁金服,4年小Android的爬坑历程
    写在开头笔者16年于长沙一个普通二本,毕业后去了满地都是机会的深圳。第一份工作是一家外包公司,主要业务是电商和电子支付信息安全方面的。一年后跳槽到华润旗下一个子公司做金融。至今已工作4年。大家都知道,对于跟我一样没有名校背景,也没有大厂出身的程序员来说,面试唯一的加分项就......
  • 转型Android系统开发,200份简历成功上岸(艰难的求职历程)
    今年的Android就业真的太不容易了,在找工作的过程中多次想放弃,被裁员两个月了,本科毕业5年,有大厂经历,Android应用4年,Android系统Framework半年左右,想要一个28K的工作都找不到。投递了200份简历,只有4个面试邀请。只好把屏蔽的外包公司都解开了,但外包的一般薪资只能达到20K左右。绝......
  • Android架构开发进阶指南,Android Jetpack Compose强化实战
    在我们日常的开发中,如果所有人各自为战,没有统一规范,久而久之,项目代码会变得混乱且后续难以维护。而这时,许多人就会使用Jetpack这个由多个库组成的套件,来减少样板代码,以便将精力更多的集中于重要的编码工作上面。统一的架构模式通常会给我们带来诸多好处,如:统一开发规范,使得代码整洁......
  • 【Flutter专题】Android Flutter入门笔记、技术解析与项目实战
    Flutter是一个跨平台、高性能的移动UI框架,其采用Dart语言开发,并使用自己的渲染引擎来绘制UI,保证了自身的高性能,保证了在Android和iOS上UI的一致性。目前Flutter已经支持iOS、Android、Web、Windows、macOS、Linux、Fuchsia(Google新的自研操作系统)等众多平台。与其他跨平......