远比ListView强大的RecyclerView简介与基本使用方法

KaelLi 2017年7月10日16:29:12
评论
5,809

在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());

 

运行效果如图所示:

远比ListView强大的RecyclerView简介与基本使用方法

当然了,今天说的只是RecyclerView最基本的用法。实际上它是一个极其强大的控件,以后还会介绍更多更强、更高级的用法。否则只是一个简单的列表展示,用ListView就足够了嘛。

 

KaelLi
  • 本文由 发表于 2017年7月10日16:29:12
  • 转载请务必保留本文链接:https://www.kaelli.com/5.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: