当前位置: 首页 > news >正文

ListView优化

在getView()方法中,每次都将布局重新加载了一遍,当ListView快速滚动的时候,这就会成为性能的瓶颈。

getView()方法中还有一个convertView参数,这个参数用于将之前加载好的布局进行缓存,以便之后可以进行重用。

因此我们可以通过他来进行优化:

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Fruit fruit = getItem(position);
        View view;
        if (convertView == null) {
            view = LayoutInflater.from(getContext()).inflate(resourceId, parent,
                false);
        } else {
            view = convertView;
        }
        ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
        TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);
        fruitImage.setImageResource(fruit.getImageId());
        fruitName.setText(fruit.getName());
        return view;
    }

不过,目前我们的这份代码还是可以继续优化的,虽然现在已经不会再重复去加载布局,但是每次在getView()方法中还是会调用ViewfindViewById()方法来获取一次控件的实例。我们可以借助一个ViewHolder来对这部分性能进行优化:

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Fruit fruit = getItem(position);
        View view;
        ViewHolder viewHolder;
        if (convertView == null) {
            view = LayoutInflater.from(getContext()).inflate(resourceId, parent,
            false);
            viewHolder = new ViewHolder();
            viewHolder.fruitImage = (ImageView) view.findViewById
            (R.id.fruit_image);
            viewHolder.fruitName = (TextView) view.findViewById (R.id.fruit_name);
            view.setTag(viewHolder); // 将ViewHolder存储在View中
        } else {
            view = convertView;
            viewHolder = (ViewHolder) view.getTag(); // 重新获取ViewHolder
        }
        viewHolder.fruitImage.setImageResource(fruit.getImageId());
        viewHolder.fruitName.setText(fruit.getName());
        return view;
    }

    class ViewHolder {

        ImageView fruitImage;

        TextView fruitName;

    }

 

转载于:https://www.cnblogs.com/lvcoding/p/8286768.html

相关文章:

  • 蓝桥杯第二届试题集锦
  • OpenAI发文怒怼:对抗样本怎么不会对检测产生干扰了?
  • mina编解码(摘录)
  • 团队作业7——第二次项目冲刺-Beta版本项目计划
  • mysql登陆密码忘记,解决办法
  • VMPlayer Ubuntu 16.04 Copy and Paste with Host 主机与宿机之间的复制粘贴
  • MyISAM 与 InnoDB 的区别
  • 牛逼的 弹出层 layer !!!
  • mysql中OPTIMIZE TABLE的作用
  • Speed up your eclipse as a super fast IDE
  • grep 正则表达式 vim及相关知识
  • 自动部署ubuntu系统时ks.cfg和ks.seed有什么不同
  • Android学习系列(19)--App离线下载
  • oracle12c管理作业资源的一种方式
  • uva 11121(-2进制)
  • [译]Python中的类属性与实例属性的区别
  • 【css3】浏览器内核及其兼容性
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Logstash 参考指南(目录)
  • SpringCloud集成分布式事务LCN (一)
  • 力扣(LeetCode)21
  • 深入浅出webpack学习(1)--核心概念
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • #《AI中文版》V3 第 1 章 概述
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (function(){})()的分步解析
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (二)JAVA使用POI操作excel
  • (力扣)1314.矩阵区域和
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (四)c52学习之旅-流水LED灯
  • (图)IntelliTrace Tools 跟踪云端程序
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .NET Micro Framework初体验(二)
  • .NET MVC第三章、三种传值方式
  • .NET中GET与SET的用法
  • .so文件(linux系统)
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @Pointcut 使用
  • [AIGC] Redis基础命令集详细介绍
  • [AX]AX2012 SSRS报表Drill through action
  • [CF543A]/[CF544C]Writing Code
  • [delphi]保证程序只运行一个实例
  • [HackMyVM]靶场 Wild
  • [Jquery] 实现鼠标移到某个对象,在旁边显示层。
  • [NOIP2000] 乘积最大
  • [office] 在Excel2010中设定某些单元格数据不参与排序的方法介绍 #其他#知识分享#笔记
  • [PAT练级笔记] 34 Basic Level 1034 有理数四则运算
  • [PAT练级笔记] 44 Basic Level 1044 火星数字
  • [python]基本输出输入函数