[转]ListView学习笔记(一)——缓存机制

要想优化ListView首先要了解它的工作原理,列表的显示需要三个元素:ListView、Adapter、显示的数据;

这里的Adapter就是用到了适配器模式,不管传入的是什么View在ListView中都能显示出来。

下面简单说下上图的原理:

1、如果你有几千几万甚至更多的选项(item)时,其中只有可见的项目(满屏显示的Item数目)存在内存(说的优化就是说在内存中的优化!)中,其他的在Recycler中

2、ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的,第一次都是为空的,只要显示过了convertView都不为空,会保存在Recycler中

3、当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图,省去了inflate和findViewById的时间,性能就得到了优化。

\

 

了解了它的工作原理后,我们就可以重复利用convertView,只要不为空就直接使用,改变它的内容就行了。

使用ListView的时候都会搭配一个Adapter,为了使得性能更优,ListView会缓存行item(某行对应的View)。ListView通过Adapter的getView函数获得每行的item。

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package com.dzt.listviewdemo;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
    private ListAdapter adapter;
    private ListView lv = null;
    private ArrayList<string> list = new ArrayList<string>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = (ListView) findViewById(R.id.lv_list);
        adapter = new ListAdapter();
        for (int i = 0; i < 100; i++) {
            list.add(item  + i);
        }
        lv.setAdapter(adapter);
    }
    private class ListAdapter extends BaseAdapter {
        private LayoutInflater mInflater;
        ListAdapter() {
            mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return list.size();
        }
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return list.get(position);
        }
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            System.out.println(getView  + position +      + convertView);
            viewHolder holder = null;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.item, null);
                holder = new viewHolder();
                holder.text = (TextView) convertView.findViewById(R.id.tv_text);
                holder.image = (ImageView) convertView
                        .findViewById(R.id.iv_img);
                convertView.setTag(holder);
            } else {
                holder = (viewHolder) convertView.getTag();
            }
            holder.text.setText(list.get(position));
            if (position % 2 == 0) {
                holder.image.setImageResource(R.drawable.ic_launcher);
            } else {
                holder.image.setImageResource(R.drawable.icon);
            }
            return convertView;
        }
    }
    /**
     * 使用一个类来保存Item中的元素
     *
     * @author Administrator
     *
     */
    public static class viewHolder {
        public TextView text;
        public ImageView image;
    }
}
</string></string>

运行效果

 

\


第一次打印的结果convertView都是为null

 

\

滑动ListView后的打印

\

 

从上面的打印消息可以看出,Recycler中会保存七个convertView对象用来显示Item,不管你有上千个Item,也只会创建显示满屏的convertView,这就大大节省了内存,对viewHolder的Tag的使用也大大节省了性能开销

转载于:https://www.cnblogs.com/DarrenChan/p/5673004.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357020.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jax-rs jax-ws_Tomcat上具有JAX-WS的Web服务

jax-rs jax-ws让我们假设一家企业正在一个集中式系统中维护用户身份验证详细信息。 我们需要创建一个AuthenticationService&#xff0c;它将获取凭据&#xff0c;对其进行验证并返回状态。 其余的应用程序将使用AuthenticationService对用户进行身份验证。 创建Authentication…

golang反编译_【Golang】脱胎换骨的defer(一)

Go语言的defer是一个很方便的机制&#xff0c;能够把某些函数调用推迟到当前函数返回前才实际执行。我们可以很方便的用defer关闭一个打开的文件、释放一个Redis连接&#xff0c;或者解锁一个Mutex。而且Go语言在设计上保证&#xff0c;即使发生panic&#xff0c;所有的defer调…

【TypeScript系列教程16】TypeScript 联合类型

TypeScript 联合类型 联合类型(Union Types)可以通过管道 (|) 将变量设置多种类型,赋值时可以根据设置的类型来赋值。 注意:只能赋值指定的类型,如果赋值其它类型就会报错。 创建联合类型的语法格式如下 Type1|Type2|Type3 实例 声明一个联合类型: TypeScript var …

HTML 4.01 规定了三种文档类型

HTML 4.01 规定了三种文档类型&#xff1a;Strict、Transitional 以及 Frameset。 严格的——该 DTD 包含所有 HTML 元素和属性&#xff0c;但不包括展示性的和弃用的元素&#xff08;比如 font&#xff09;。不允许框架集&#xff08;Framesets&#xff09;。 <!DOCTYPE HT…

cad填充图案乱理石_CAD软件中如何自定义CAD填充图案?

在使用浩辰CAD软件绘制完成图纸后&#xff0c;发现自己绘制的CAD图纸没有做好区域分割&#xff0c;显得特别乱。这个时候该怎么办呢&#xff1f;快试试CAD填充图案吧&#xff01;接下来就由小编来给大家介绍一下浩辰CAD软件中自定义CAD填充图案的操作教程吧&#xff01;浩辰CAD…

单例设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

Vue.js 组件编码规范

提供一种统一的编码规范来编写 Vue.js 代码。这使得代码具有如下的特性&#xff1a;* 其它开发者或是团队成员更容易阅读和理解。 * IDEs 更容易理解代码&#xff0c;从而提供高亮、格式化等辅助功能 * 更容易使用现有的工具 * 更容易实现缓存以及代码包的分拆基于模块开发始终…

centos图形化桌面的文件在哪_CentOS 安装图形桌面

1.显示系统已经安装的组件&#xff0c;和可以安装的组件:#yum grouplist|grep -i "x window"2.如果系统安装之初采用最小化安装&#xff0c;没有安装xwindow&#xff0c;那么先安装&#xff1a;#yum groupinstall "X Window System"3.安装GNOME桌面环境yum…

java高级架构师进阶路线,年薪百万的架构师都是按照这个路线学习的

一个合格的架构师,在接到这些产品,业务需求的时候,一定要能够全面的思考,给出除了业务需求外的系统需求,并要求自己或其他同学要去设计和实现这些系统需求。 所以你需要掌握这些知识点 目录 1.基本功 七大软件设计原则 设计模式 2.架构师审美观 spring源码分析

每天一个linux命令(53)--ps命令

要毁掉一天&#xff0c;从早上开始。 Linux中的ps命令是 process status 的缩写。ps 命令用来列出系统中当前运行的那些进程。ps 命令列出的是当前那些进程的快照&#xff0c;就是执行ps 命令的那个时刻的那些进程&#xff0c;如果想要动态的显示进程信息&#xff0c;就可以使用…

ansi编码转换_8b/1b编码是个什么东东

使用串行比并行总线可以节省更多的布线空间&#xff0c;芯片、电缆等的尺寸可以做得更小&#xff0c;同时传输速率更高。但是&#xff0c;在很多数字系统如CPU、DSP、FPGA等内部&#xff0c;进行数据处理的最小单位都是Byte&#xff0c;即8个bit&#xff0c;如何把一个或多个By…

格拉布斯准则异常数据_异常处理准则和最佳实践

格拉布斯准则异常数据让我们回顾一些基本的异常设计准则&#xff0c;这些准则从“对象设计&#xff1a;角色&#xff0c;职责和协作”中进行了总结&#xff08;Rebecca Wirfs-Brock和Alan McKean&#xff0c;Addison-Wesley&#xff0c;2003年&#xff09;。 不要尝试处理编码错…

使用CSDN云服务搭建一个WordPress 个人站点(详细教程)

目录 前言 站点效果图 搭建服务的一些准备工作 第一步。进入到云服务我的账号模块&#xff0c;创建一个项目&#xff0c; 第二步&#xff0c;先免费领取一台云主机&#xff0c; 第三步&#xff0c;进入云主机控制台 搭建站点操作步骤 第一步&#xff0c;登录云主机 第二…

echarts 卡_图表太丑怎么破,ECharts神器带你飞!

一、前言在本专栏或文集中&#xff0c;我曾多次使用ECharts绘制图表、进行可视化&#xff0c;也渐渐积累了30多个实例&#xff0c;本文对此前用过的所有图表和代码进行整理并分享&#xff0c;以给想绘制精美图表的人一点绵薄的帮助。其中全部实例已上传ECharts3官网的个人主页&…

Apache Lucene基础教程

课程大纲 Apache Lucene是一个免费/开源信息检索软件库&#xff0c;它提供基于Java的索引和搜索技术&#xff0c;以及拼写检查&#xff0c;命中突出显示和高级分析/令牌化功能。 Lucene是完全用Java编写的高性能&#xff0c;功能齐全的文本搜索引擎库。 它是一项适用于几乎所有…

使用CSDN云服务搭建一个WordPress 个人站点(视频教程)

目录 前言 视频教程 文字版教程 云主机体验地址 官方文档 前言 六一儿童节体验了一下CSDN云主机相关的服务&#xff0c;感觉最近官方最近变化很大&#xff0c;业务范围很广&#xff0c;这里简单体验了一下云主机&#xff0c;给大家分享一点心得&#xff0c;希望对大家有所启…

sql性能优化之多表联查

先贴上我优化后的核心代码&#xff1a; select * into #result from ( select p.AchivementCount,isnull(a.ByAttentionCount,0) ByAttentionCount, u.Id,u.FullName,j.Name PostionName,u.ProfessionId,u.Disabled,u.UserName,u.ResearchArea,u.PositionId,u.DepartmentId,u.O…

石板切割问题c语言_岩知识 | 岩板切板有讲究,工艺问题要注意

岩板的火继续烧着&#xff0c;岩板的深加工厂在不断地增加着&#xff0c;岩板的深加工产品正在走向各个建筑项目&#xff0c;逐渐在受到很多项目的宠爱。岩板作为与天然石材完全不同的产品&#xff0c;其优越的理化性能在许多方面胜过天然石材&#xff0c;但也有其严重的不足。…

JavaScript测验题回顾-刷题笔记001

目录 1.我们可以在下列哪个 HTML 元素中放置 Javascript 代码&#xff1f;​编辑 2.写 "Hello World" 的正确 Javascript 语法是&#xff1f; 3.插入 Javacript 的正确位置是&#xff1f; 4.引用名为 "xxx.js" 的外部脚本的正确语法是&#xff1f; 5.如…

C/C++中无条件花括号的妙用

C/C中无条件花括号可以形成一个代码块&#xff0c;一个作用域。可以使括号内定义的变量就只在本域&#xff08;就是这个大括号&#xff09;内有效&#xff0c;而且不会影响其他域&#xff0c;即使名字相同。 在花括号内&#xff0c;如果变量前面带类型&#xff0c;则相当于新创…