Android高级控件ListView和GridView原理分析

来源:互联网 发布:网络体系结构是指 编辑:程序博客网 时间:2024/06/02 22:39

 对于Android开发来说,ListView控件在应用开发中的作用是举足轻重的,它以列表的形式展示内容,并且能够根据数据长度自适应显示。
  列表数据的显示需要四个元素,分别为:
  (1)用来展示列表视图的ListView;
  (2)用来把数据映射到ListView上的Adapter(适配器);
  (3)提供给ListView展示的数据集;
  (4)数据展示的View界面模板。
 首先最常用的列表展示类型的控件自然是ListView,该控件的职责是加载、管理视图,它并不关心有多少项数据,每一项数据将如何显示。除加载和管理视图之外的事情是由Adapter来完成的,通过Adapter模式,用户只需要覆写特定的几个函数就可以将ListView的每项数据(ItemView)构建出来。需要实现的Adapter函数为:
 (1)getCount();——获取数据的个数;
 (2)getItem(int position);——获取position位置上的数据;
 (3)getItemId(int position);——获取position位置上的数据Id,一般只返回position即可;
 (4)getView(int position,View convertView,ViewGroup parent);——获取position位置上的ItemView视图。
 在这几个函数里面最重要的是最后一个函数getView(),下面给出这个函数使用的一般方法:
 

public View getView(int position, View convertView, ViewGroup parent){   View view = null;   //有视图缓存,复用视图   if(convertView != null){       view = convertView;   }else{   //重新加载视图   }   //进行数据绑定   //返回ItemView   return view;}

getView函数的position表示该视图是第几项数据,convertView表示缓存的ItemView,parent表示该ItemView的父视图。
  ListView加载视图的原理:
当ListView加载时会根据数据的个数来创建ItemView,然后根据该View的索引从数据集合中获取数据,调用getView()获取具体的视图,并且与数据绑定。但是,并不是有多少数据就会产生多少ItemView,Android采用了视图复用的形式来避免创建过多的ItemView,这样能够非常有效的提升性能和降低内存占用率。
在处理的数据量较大时,ListView会构建铺满屏幕所需要的ItemView个数,当屏幕向下滚动时,第一项数据会滚出屏幕的可见范围之内,并且进入ListView的一个Recycler中,Recycler会将该视图缓存。当需要加载新的ItemView时ListView会首先检查Recycler中获取视图,如果视图存在就直接使用该缓存的视图,如果不存在则会创建新的视图。
   从设计模式的角度看待ListView的原理:
ListView的核心就是使用了Adapter模式,并且在Adapter类中还使用了观察者模式,Adapter内部有一个可观察者类,ListView则作为它的其他的其中一个观察者。在将Adapter设置到ListView时,ListView会被注册到这个观察者对象中。setAdapter的代码如下:

@Overridepublic void setAdapter(ListAdapter adapter){    resetList();    mRecycler.clear();//清空视图缓存mRecycler    if ( mAdapter != null){        mDataSetObserver = new AdapterDateSetObserver();        //将mDateSetObserver注册到adapter中        mAdapter.registerDataSetObserver(mDataSerObserver);    } else {    //...    }    requestLayout();}
0 0