listview原理


一:什么是listview

ListView是一个ViewGroup显示滚动的列表项。列表项使用一个Adapter将自动插入到列表中,将内容从数据源如数组或数据库查询的每一项结果放在列表的视图。


二:列表显示需要三个元素

1.ListView:用来展示列表的view

2.适配器:用来把数据映射到listview上

3.数据:具体将被映射的字符串,图片,或者基本组件

根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter,BaseAdapter。

推荐使用BaseAdapter


三:listview绘制流程

系统要绘制listview,首先用getCount()得到要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用geiView,在这个函数里面首先获取一个view(或者viewGroup),然后再实例化并设置各组件及其数据内容并显示它。绘制完这一行,继续绘制下一行,直到绘制完为止。


四:listview加载数据的原理

listview针对每一个item,要求adapter“返回一个视图”(getview),也就是说listvew在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listview的长度,然后根据这个长度,调用getView()一行一行的绘制listview的每一项。如果你的getCount()返回值是0的话,列表一行都不会显示,如果返回1就显示一行,返回几行就显示几行。如果我们有几千几万甚至更多的item要显示怎么办?为每一个item创建一个新的view?不可能!!!实际上Android早已经缓存了这些视图,大家可以看下面这个截图来理解,这个图解释listview工作原理的经典图,大家可以收藏下,不懂得时候拿出来看看,加深理解,其实android有一个叫Recycler的构建。下图是listview加载数据的工作原理:

listview原理_第1张图片

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

1.如果你有几千几万甚至更多的item时,其中只有可见的选项存在内存(即优化的是内存)中,其他的在Recycler中

2.listview通过getview返回视图作为item列表显示,getview先按顺序返回所有可见item视图(创建item1到item7),这时候,convertView在getView中是null

3.当item1滚出屏幕,并且一个新的item从屏幕低端上来时,getview返回item视图(创建item8)。item1这时候存放在一个叫做Recycler的构件中,这时候convertView还是null

当item2滚出屏幕,并且一个新的item从屏幕低端上来时,getview返回item视图(从Recycler构件获取item1作为item石头鱼)。item2这时候存放在一个叫做Recycler的构件中,这时候converView的值是item1.你只需要设定新的数据然后返回convertView,而不必重新创建一个视图


你可能感兴趣的:(listview原理)