重要的View

用户界面都是有Acitivity组件,Activity中关联了一个PhoneWindow创建,在这个窗口下则管理了一个视图树。这个试图树的顶级试图就是一个Viewgroup类型的DecorView,DecorView下就是各个视图控件。
listview加载时会根据数据的个数来创建Item view,根据索引从数据集合中获取数据,调用getView获取具体的试图,并且与数据绑定。但是并不是有多少数据项就会产生多少Item view,android采用了视图复用的形式来避免创建过多的Item view,这样能够非常有效的提升性能和降低内存占用率。当屏幕向下滚动时,第一项数据将会滚出屏幕的可见范围之内,并且进入Listview的一个Recycler中,Recycler会将该视图缓存,而此时下面的数据也需要加载,Listview首先会从 Recycler中获取视图,如果视图存在,那么用户可以直接使用该缓存视图,或者重新创建新的视图。
getView函数的position就表示该视图是第几项数据,convertView就表示缓存的Item view,Listview只会展示有限数量的Item view,例如8个Item view就能够铺满屏幕,那么即使数据项有1000个,通过复用机制Item view可以只产生8个,这样既节约内存又能很大程度上提高运行效率。复用Itemview机制也是优化Listview等集合组件最重要的手段。
Listview运用了Adapter模式,在Adapter中还用了观察者模式。Adapter内部有一个可观察者类,Listview则作为它的其中一个观察者。在将adapter设置给Listview时,Listview会被注册到这个观察者对象中。Listview就是通过Adapter模式、观察者模式、Item View复用机制实现了高效的列表显示。
RecyclerView将替代listview而出现,它的设计与listview类似,也使用了adapter,这个adapter是RecyclerView的一个静态内部类。RecyclerView还封装了一个ViewHolder类型,该类型中有一个itemview字段,代表的就是每一项数据的根视图,需要在构造函数中传递给ViewHolder对象。RecyclerView这么设计相当于android团队将listview的adapter进行了再次封装,把getView函数中判断是否含有缓存的代码封装到RecyclerView内部,使这部分逻辑对用户不可见。用户只需要告诉RecyclerView每项数据是怎么样的以及将数据绑定到每项数据上,分别对应的函数为onCreateViewHolder函数、onBindViewHolder函数。用户只需要完成具体的ViewHolder构造以及数据绑定即可。它的另一个特点就是将布局方式抽象为LayoutManager,默认提供了LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager布局。RecyclerView通过桥接的方式将布局职责抽离出去,通过组合的形式可以方便修改布局方式。还有RecyclerView对于Item view的控制也更为精细,可以通过ItemDecotation为Item View添加装饰,也就是在Item view上进行二次加工;又可以用ItemAnimator为Item View添加动画。职责分明、结构清晰使得RecyclerView具有了非常好的扩展性,这也是它成为未来几年最重要控件的原因。
ViewPage和Fragment结合在一起使用时简直可称为"黑白双煞",android也深知其的重要性,因此提供了几个适用于Fragment的Adapter。通常来说,定制含有Item view类型的控件都应该使用Adapter模式,因为你不知道用户的Item view是怎样的,你只能通过一个Adapter来进行抽象,让用户将具体的视图、数据通过Adapter进行操作。例如,通过getitem获取某个数据、通过getView获取每个Item view,这样一来变化的部分就交给用户来实现,控件只需关注自身的逻辑,然后通过Adapter的getView来获取每个Item view即可。ViewPage内部同样也维护了一个视图集合,这些视图集合横向布局,用户可以通过左右滑动来进行页面切换。ViewPage通常都用于显示Fragment,而ViewPage与Fragment组合时通常会有一个指示器ViewPagerIndicator来表明当前显示的是哪个页面。ViewPagerIndicator会与ViewPager进行管理,并且通过viewpager的adaper(FragmentPagerAdapter)获取页面数量、每个页面的标题等信息,然后绘制出指示器视图。当ViewPager滚动时,指示器视图也会发生相应的变化,以此达到指示页面的效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章