android v7兼容包RecyclerView的使用(二)

上篇文章 android v7兼容包RecyclerView的使用(一)讲了RecyclerView的最基本用法,现在开始挖掘更详细的内容。 在RecyclerView的API中,有这样一句话

A flexible view for providing a limited window into a large data set.

大致意思就是:当有大量的数据显示在一个有限大小的窗口上时,RecyclerView就是解决这种情况的一个灵活的View。

从以上描述可以看出RecyclerView的使用场景。如果我们有大量的同一类型的数据要显示在屏幕上,而此时很有可能整个屏幕无法完全显示所有的数据,这时候RecyclerView就是一个合适的选择。当用户上下滚动屏幕的时候,item的循环重复利用也在同时进行,当一个新的item进入可视范围,必然有一个旧的item移出可视范围,而这个被移出的item也就被循环重用。那么循环重用item有什么作用呢,其实他是很有用的一种方法,因为它节省了CPU资源和内存。

或许你会说我们用ListView用了很长的时间了,RecyclerView与我们以前的方式有什么特别的地方呢,从前,我们使用listview的时候,显示,循环重用以及其它的一些东西都有一定程度上的耦合性,现在RecyclerView则提供了一种更加灵活的方式。

谷歌现在使用的这种方法,它不在乎RecyclerView所看到的东西,也不在乎元素是否显示在正确的地方,更不在乎每个元素是如何分隔的。RecyclerView做的事仅仅是是回收。因此得名RecyclerView。

下面是几个和RecyclerView有关的最重要的类

Adapter:适配器,绑定数据集 ViewHolder:根据当前的数据保存视图 LayoutManager:布局管理器。决定item如何摆放 ItemDecoration:勉强理解为item装饰器,可以美化item ItemAnimator:动画,当一个item被增加,删除或者重新摆放时,会有动画效果。

ViewHolder

安卓官方已经推荐使用ViewHolder模式有很长一段时间了,因为它能在一定程度上大大提高效率,界面流畅性增加。RecyclerView的适配器是一个内部类,我们通过继承它来扩展我们的子类,就像这样。

.ViewHolder { TextView title;//item界面上的一个元素 TextView description;(View itemView) {super(itemView);//关联引用title= (TextView) itemView.findViewById(R.id.title);description= (TextView) itemView.findViewById(R.id.description); }}RecyclerView.Adapter

适配器完成两个主要功能:负责建立基础数据集和单个item布局之间的联系。适配器是Android的一个重要部分之一。它被用在许多地方,比如ListView, AutoCompleteTextView, Spinner都用到了适配器。

谷歌使用了RecyclerView的内部类Adapter代替了传统的Adapter,所以在RecyclerView中,你不会见到类似SimpleCursorAdapter, ArrayAdapter这样的适配器。

然而不幸的是谷歌并没有提供RecyclerView.Adapter的默认实现类,它是一个抽象类,所以我们必须去实现三个方法。

public VH onCreateViewHolder(ViewGroup parent, int viewType) public void onBindViewHolder(VH holder, int position) public int getItemCount()

VH是一个继承自ViewHolder的泛型,在子类中必须提供具体的类型。最基本的适配器写法如下

.Adapter<RecyclerViewAdapter.ItemViewHolder> {private List<DemoModel> items;RecyclerViewAdapter(List<DemoModel> modelData) {if (modelData == null) {throw new IllegalArgumentException(“modelData must not be null”);}this.items = modelData;}@Overridepublic ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item,viewGroup,false);return new ItemViewHolder(itemView);}(ItemViewHolder viewHolder, int position) {DemoModel model = items.get(position);viewHolder.title.setText(model.getTitle());viewHolder.description.setText(model.getDescription());}() {return items.size();}.ViewHolder {// … shown above in the ViewHolder section}}RecyclerView.LayoutManager

布局管理器是RecyclerView最有意思的一个地方,它负责对所有子item进行布局,在最新的v7兼容库中,它有三个实现类,分别是LinearLayoutManager(线性布局),GridLayoutManager(a网格布局),StaggeredGridLayoutManager(流式布局),默认情况下,如果我们不设置布局管理器,将使用线性布局。我们可以通过继承该类实现自己的布局管理器,由我们自己决定如何摆放item的内容,,然而,当你去看上面的三个实现类的代码时,你会发现这是多么不容易的一件事。。。代码好长。。。真的!布局管理器的具体使用方法将再开一篇博客,这里先介绍一下线性布局管理器的简单使用。代码如下

//实例化对象LinearLayoutManager layoutManager = new LinearLayoutManager(context);//设置布局方向为竖直layoutManager.setOrientation(LinearLayoutManager.VERTICAL);//滚动到那一项layoutManager.scrollToPosition(currPos);//设置布局管理器recyclerView.setLayoutManager(layoutManager);RecyclerView.ItemDecoration

姑且我叫它为item装饰器,使用ItemDecoration我们可以给item增加偏移量,增加item分割线,高亮等等。我们可以能增加很多个ItemDecoration,RecyclerView 会依次遍历所有的ItemDecoration并调用绘图方法去完成装饰。它有三个抽象方法

public void onDraw(Canvas c, RecyclerView parent) public void onDrawOver(Canvas c, RecyclerView parent) public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent)

人,也总是很难发现自己的错误,

android v7兼容包RecyclerView的使用(二)

相关文章:

你感兴趣的文章:

标签云: