各位看官们,大家好,上一回中咱们说的是Android中UI控件之ListView优化的例子,这一回咱们说的例子是UI控件之RecyclerView。闲话休提,言归正转。让我们一起Talk Android吧!
看官们,我们在前面章回中介绍了ListView组件,今天我们将介绍ListView组件的升级版:RecyclerView组件。之所以叫它升级版本是因为它是官方推出的组件,而且官方推荐使用它来替代ListView组件。它虽然和ListView一样是用来在有限的屏幕空间内滚动显示大量数据,但是它比ListView的显示效率高,因为它每次只创建一个屏幕可以显示的列表,当滑动屏幕时,它自动销毁从屏幕中消失的列表,然后再创建新的列表显示到屏幕中,这样循环往复。细看一下这操作就和它的名字一样,如果和数据结构对比的话,就有点循环队列的意思。接下来我们通过文本结合代码的方式来介绍如何使用RecyclerView组件。
- 1.在布局文件中添加RecyclerView组件。通常是在Activity或者Fragment的布局文件中添加。添加时需要使用完整包名,因为它是support库中的东西。代码如下:
<android.support.v7.widget.RecyclerViewandroid: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));
- 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。
- onCreateViewHolder方法主要是加载布局文件和创建ViewHolder;这里的布局文件指Recycler包含的布局,也就是显示到屏幕中的布局。
- onBindViewHolder方法主要是为RecyclerView包含的布局中各个控件添加数据,进而实现数据和视图的连接操作(也可以理解为更新数据)。
- 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"><TextViewandroid: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的ViewHolderpublic 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;}}@Overridepublic CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {//获取View对象,这里的布局就是刚才创建的,看布局id就能明白。//它用来显示Recylerview中具体的列表项View view = LayoutInflater.from(parent.getContext()).inflate (R.layout.recycler_view_layout,parent,false);//创建viewHoldCustomViewHolder customViewHolder = new CustomViewHolder(view); //返回ViewHolderreturn customViewHolder; }@Overridepublic void onBindViewHolder(CustomViewHolder holder, int position) {//通过position参数获取列表项在Recylerview中的位置,然后更新该位置的数据holder.getTextView().setText(mStrings[position]); }@Overridepublic 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基础的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!