博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]ListView学习笔记(一)——缓存机制
阅读量:6291 次
发布时间:2019-06-22

本文共 3289 字,大约阅读时间需要 10 分钟。

要想优化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的使用也大大节省了性能开销

转载地址:http://nncta.baihongyu.com/

你可能感兴趣的文章
Unity C# 设计模式(七)适配器模式
查看>>
Lancel sac négociation avec insistance que nous pourrions réaliser de quelle route
查看>>
空白表单提交到后台的数据类型总结(java)
查看>>
Vue问题区
查看>>
[原]Unity3D深入浅出 - Shader基础开发
查看>>
netty之ByteBuf详解
查看>>
数据泵导出oracle 10g数据库
查看>>
LYSE-模块
查看>>
Date Picker和UITool Bar控件简单介绍
查看>>
sql server 实现多表连接查询
查看>>
HTTP 1.1与HTTP 1.0的比较
查看>>
如何在命令行脚本中启动带参数的Windows服务
查看>>
abstract vs interface
查看>>
nodejs笔记1 ----关于express不是本地命令
查看>>
python debug
查看>>
docker-machine 远程安装docker
查看>>
最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等
查看>>
Java Web之Servlet中response、request乱码问题解决
查看>>
felx屏蔽文本框输入回车
查看>>
[转载].NET商业软件源码保护
查看>>