一起Talk Android吧(第七十六回:Android中UI控件之RecyclerView基础)

各位看官们,大家好,上一回中咱们说的是Android中UI控件之ListView优化的例子,这一回咱们说的例子是UI控件之RecyclerView。闲话休提,言归正转。让我们一起Talk Android吧!

看官们,我们在前面章回中介绍了ListView组件,今天我们将介绍ListView组件的升级版:RecyclerView组件。之所以叫它升级版本是因为它是官方推出的组件,而且官方推荐使用它来替代ListView组件。它虽然和ListView一样是用来在有限的屏幕空间内滚动显示大量数据,但是它比ListView的显示效率高,因为它每次只创建一个屏幕可以显示的列表,当滑动屏幕时,它自动销毁从屏幕中消失的列表,然后再创建新的列表显示到屏幕中,这样循环往复。细看一下这操作就和它的名字一样,如果和数据结构对比的话,就有点循环队列的意思。接下来我们通过文本结合代码的方式来介绍如何使用RecyclerView组件。

  • 1.在布局文件中添加RecyclerView组件。通常是在Activity或者Fragment的布局文件中添加。添加时需要使用完整包名,因为它是support库中的东西。代码如下:
    <android.support.v7.widget.RecyclerView
        android:id="@+id/id_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>
  • 2.在代码中加载RecyclerView组件的布局。通常是在Activity的onCreate方法或者Fragment的onCreateView方法中加载它的布局,这和普通组件的加载方法相同:
    //获取RecyclerView控件,该控件定义于上面的布局中
     mRecyclerView = (RecyclerView)view.findViewById(R.id.recyclerview);    
  • 3.设置LayouManager。使用该组件的setLayoutManager方法。代码如下:
     mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));

这是它和ListView显著的不同点,为什么要加载布局管理器呢?因为Recyclerview的滚动和列表项定位工作都是靠它完成的。我们在这里使用的是LinearLayoutManager,也可以使用其它的布局管理器,比如 GridLayoutManage

  • 4.创建适配器(Adapter)对象,并且为RecyclerView设置Adapter。具体的代码如下:
    //把Recylerview和adapter关联起来,CustomAdapter稍后介绍
     mRecyclerView.setAdapter(new CustomAdapter(mData));    

简单起见,在这里的把mData定义成一个数组,在实际中可以依据项目需求来定义。但是不管如何定义,它都要和适配器的构造函数保持一致,不然没有办法把数据传递给适配器。此外,这也是可以进行扩展的地方,我们将在后面章回中介绍,下面是与mData相关的代码:

    private String[] mData = new String[50];
    for(int i=0; i<50;++i){
        mData[i]= "This is item "+(i+1);
    }

接下来该适配器出场了,代码中的CustomeAdapter类是RecyclerView.Adapter的子类,也就是说RecyclerView已经把适配器的规范定义好了,我们只需要按照规范去实现就可以,那么有哪些规范呢?规范主要是实现一个ViewHolder(这个不陌生吧),并且重写onCreateViewHolder()方法,onBindViewHolder()方法和getItemCount

  1. onCreateViewHolder方法主要是加载布局文件和创建ViewHolder;这里的布局文件指Recycler包含的布局,也就是显示到屏幕中的布局。
  2. onBindViewHolder方法主要是为RecyclerView包含的布局中各个控件添加数据,进而实现数据和视图的连接操作(也可以理解为更新数据)。
  3. getItemCount方法主要是获取RecyclerView中条目的数量,这个数量是指所有数据的数量,而不是在屏幕上显示数据的数量。

下面是代码,不过首先要创建一个布局文件,用来显示RecyclerView中每行或者每列显示的内容,至于布局中显示哪些的内容可以依据项目需求来定。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">
   <TextView
        android:id="@+id/id_recy_view_item_text"
        android:layout_width="wrap_content"
        android:layout_height="18dp"/>
</LinearLayout>

我们创建了一个叫recycler_view_layout的布局文件,简单起见,我们只放了一个文本组件,用来显示一行文本内容。布局创建好以后,接下就是重头戏:创建适配器。

//注意适配器是泛型
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder>{ 

//自己定义的数据容器,这里使用简单的字符串数组,可以是list或者其它容器,容器中的数据类型可以自己定义
    private String[] mStrings; 

    //定义ViewHolder,继续自RecyclerView的ViewHolder
    public static class CustomViewHolder extends RecyclerView.ViewHolder{
        //RecyclerView中每一个子项包含的组件,也就是RecyclerView每行或者每列显示的内容
        public TextView tv; 

       //ViewHolder就是一个数据容器
        public CustomViewHolder(View v){
            super(v);
            //获取RecyclerView中的组件
            tv =(TextView) v.findViewById(R.id.id_recy_view_item_text);
        }
        public TextView getTextView(){
            return tv;
        }
    }

    //重写适配器的构造器,目的是把数据传入到适配器中
    public CustomAdapter(String[] strings){
        if(strings != null) {
            mStrings = strings;
        }
    }
    @Override
    public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //获取View对象,这里的布局就是刚才创建的,看布局id就能明白。它用来显示Recylerview中具体的列表项
        View view = 
        LayoutInflater.from(parent.getContext()).inflate 
        (R.layout.recycler_view_layout,parent,false);

        //创建viewHold
        CustomViewHolder customViewHolder = new CustomViewHolder(view); 
        //返回ViewHolder
        return customViewHolder;  
    }
    @Override
     public void onBindViewHolder(CustomViewHolder holder, int position) {
        //通过position参数获取列表项在Recylerview中的位置,然后更新该位置的数据
        holder.getTextView().setText(mStrings[position]); 
    }

    @Override
    public int getItemCount() {
        //这个长度比较重要,如果为0,那么recylerview中不会有任何数据显示。
        return mStrings.length;
    }
}

上面的代码,完全是按照RecyclerView.Adapter的规范来写的,这和ListView不一样,我们可以自己扩展。另外,我们还创建了一个布局文件,用来显示RecyclerView中每一项的内容,该布局不像ListView一样可以使用系统提供的,因为系统没有提供,只能自己定义。

此外,RecyclerView组件是support库中的东西,它不在SDK中,使用该组件时需要添加支持库,可以手动修改app目录下的build.gradle文件,在dependencies中添加:

compile 'com.android.support:recyclerview-v7:25.1.0'

或者修改项目配置,AST会自动修改gradle文件。修改步骤:
AST Menu->File->ProjectStructure->app.

不过添加的Recyclerview组件要和support库的版本一致,不然会出现不兼容的问题。我使用的版本如下:

    compile 'com.android.support:appcompat-v7:25.1.0'
    compile 'com.android.support:recyclerview-v7:25.1.0'

下面是程序运行的结果,请参考:

这里写图片描述

各位看官,关于Android中UI控件之RecyclerView基础的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!


猜你喜欢

转载自blog.csdn.net/talk_8/article/details/80644149