各位看官们,大家好,上一回中咱们说的是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
。
- 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">
<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基础的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!