在App里,列表类的控件绝对是重中之重,是最常用的控件之一。从Android诞生之日起,Google就为我们提供了ListView,它也陪伴众多开发者和用户一起度过了好多年的时光。然而随着时代的发展,旧的ListView已经不能满足需求了。Google也就顺势而为,给我们带来了一个更加强大的控件,就是我们今天的主角——RecyclerView了。
如果从名字上理解,那么RecyclerView就表示是一个可回收的视图。这点该怎么理解呢?我们知道,ListView在使用的时候,在实际项目中使用ViewHolder来提升性能节约内存是必须要做的,但实际上Android本身并没有对此做强制要求,你就是不使用ViewHolder也不会出错,只是你的ListView性能会低下罢了。而在RecyclerView这里,会强制你使用ViewHolder,这是一个很有必要的改进。
来看一个RecyclerView的简单使用吧:
首先,请在module的build.gradle文件里面,添加项目对于RecyclerView的依赖,因为RecyclerView是Google单独提供给开发者的,而没有包含在support的v4、v7或者v13的包中:
compile 'com.android.support:recyclerview-v7:25.3.1'
在布局文件里,依然是简单的声明一个RecyclerView即可:
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/
在Java代码中,RecyclerView的使用跟你所熟悉的ListView没有太大区别,最大的不同之处在于,你需要给它设置一个LayoutManager。如果是最平常的垂直方向的,则是这样:
recyclerView = (RecyclerView)findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
之后,就需要设置一个Adapter了。我们之前说过,RecyclerView的Adapter是强制使用ViewHolder的:
class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new ViewHolder(LayoutInflater.from(MainActivity.this).inflate(R.layout.item_recyclerview, parent, false)); } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.textView.setText("这是RecyclerView的第" + position + "个元素"); } @Override public int getItemCount() { return 20; } class ViewHolder extends RecyclerView.ViewHolder { private TextView textView; public ViewHolder(View itemView) { super(itemView); textView = (TextView)itemView.findViewById(R.id.textView); } } }
我这种写法,是把Adapter类直接写在Activity里面的,当然你可以让它单独分在一个java文件里面,唯一的区别在于需要把相应的Context以及其他数据传递进去而已。在MyAdapter类里面有一个内部类ViewHolder,这个就是我们必须实现的,而不是像ListView那样凭自己喜好。可以看到,RecyclerView的Adapter是必须实现3个方法的:onCreateViewHolder、onBindViewHolder和getItemCount。3个方法言简意赅,从名字上不难理解其作用:onCreateViewHolder就是创造了一个ViewHolder,返回值的类型就是你自己所实现的ViewHolder,实际上也就是加载了每个item的布局文件,从而获得了一个View。而在onBindViewHolder中,实现了数据与ViewHolder的绑定。在getItemCount里,可以设定RecyclerView一共有多少个元素。
然后初始化Adapter,并把Adapter对象赋给RecyclerView对象即可。
recyclerView.setAdapter(new MyAdapter());
运行效果如图所示:
当然了,今天说的只是RecyclerView最基本的用法。实际上它是一个极其强大的控件,以后还会介绍更多更强、更高级的用法。否则只是一个简单的列表展示,用ListView就足够了嘛。
评论