学习安卓开发[3] - 使用RecyclerView显示列表
在上一篇学习安卓开发[2] - 在activity中托管fragment中了解了使用fragment的好处和方法,本次记录的是在进行列表展示时recyclerview的使用。
- recyclerview介绍
- recyclerview及其相关类
- recyclerview的应用
- 引入recyclerview
- 关联recyclerview和fragment
- viewholder
- adapter
- 将adapter和recyclerview关联
recyclerview介绍
很多时候都需要进行列表的展示,比如商品列表,一般的做法是创建一个商品的通用布局,在请求到商品列表数据后,将商品数据转换为商品对象并与一个商品view绑定,这样循环操作就实现了列表的效果。
但如果列表项有很多怎么办呢,如果一次性初始化全部的view很容易搞垮程序。在pc和web程序中可以使用分页的方式,但如果照搬到运行移动app的小屏设备体验会非常差。在小屏设备适合上下滑动的方式,那么能否将上下滑动与分页结合,每次只初始化足够一屏显示的view数量呢,答案是肯定的,recyclerview就是干这个的。
recyclerview的作用的是按需创建view对象,当view被滑动到屏幕外后,recyclerview便会将其回收再利用。
recyclerview及其相关类
要实现这个功能,recyclerview还需要viewholder和adapter的协助,它们之间的关系为:
图中没有显示adapter的位置,实际上它工作在在recyclerview和viewholer之间,负责为recyclerview提供viewholer对象。adapter是一个控制器对象,从模型层获取数据,然后提供给recyclerview显示,起动桥梁的作用。
recyclerview的应用
引入recyclerview
recyclerview类来自google支持库,所以首先需要添加recyclerview依赖库,这里使用的是recyclerview-v7支持库。然后就可以在列表布局文件中使用它了:
<android.support.v7.widget.recyclerview xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/crime_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.recyclerview>
注意要给其指定id。
关联recyclerview和fragment
@override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { view view = inflater.inflate(r.layout.fragment_crime_list, container, false); mcrimerecyclerview = (recyclerview) view .findviewbyid(r.id.crime_recycler_view); mcrimerecyclerview.setlayoutmanager(new linearlayoutmanager(getactivity())); return view; }
代码使用了setlayoutmanager(),因为recyclerview无法独立工作,需要layoutmanager的支持,recyclerview在创建完视图后,就立即转交给了layoutmanager,屏幕上列表项的摆放就是layoutmanager负责的,此外它还负责屏幕的滚动行为。
viewholder
viewholder的职责相对简单,既容纳单个列表项view。基本的viewholder使用方式如下,其中list_item_crime为单个列表项view的名称。
private class crimeholder extends recyclerview.viewholder{ public crimeholder(layoutinflater inflater, viewgroup parent) { super(inflater.inflate(r.layout.list_item_crime, parent, false)); } }
adapter
在需要显示新创建的viewholder或让view对象与已经创建的viewholder关联时,recyclerview会去问adapter要,recyclerview工作在较高的抽象层,不会关心具体的view对象,这是adapter需要做的事。
private class crimeadapter extends recyclerview.adapter<crimeholder> { private list<crime> mcrimes; public crimeadapter(list<crime> crimes) { mcrimes = crimes; } @override public crimeholder oncreateviewholder(viewgroup parent, int viewtype) { layoutinflater layoutinflater = layoutinflater.from(getactivity()); return new crimeholder(layoutinflater, parent); } @override public void onbindviewholder(crimeholder holder, int position) { crime crime = mcrimes.get(position); holder.bind(crime); } @override public int getitemcount() { return mcrimes.size(); } }
将adapter和recyclerview关联
编写好了recyclerview、viewholer和adapter,接下来只需将将adapter和recyclerview关联,就可以正常工作了
编写updateui方法,然后在oncreateview()中,返回view之前调用:
private void updateui() { crimelab crimelab = crimelab.get(getactivity()); list<crime> crimes = crimelab.getcrimes(); madapter = new crimeadapter(crimes); mcrimerecyclerview.setadapter(madapter); }
上一篇: python学生信息管理系统(初级版)
下一篇: 微信小程序实现跑马灯效果