在Android开发中,ListView是用途非常广泛的控件,与它类似的还有GridView。为了统一性和代码的解耦性,google在V7包中新增了RecyclerView控件,来代替ListView和GridView控件。
RecyclerView的用法其实非常简单,它可以通过设置LayoutManager来控制它的布局,官方给出了三种布局可供选择,分别是线性布局LinearLayoutManager、九宫格布局GridLayoutManager以及瀑布流布局StaggeredGridLayoutManager。也就是说recyclerView只负责创建和显示列表,布局什么的事情都交给LayoutManager来做。但是RecyclerView也有它的不便,它并没有自己的onItemClick方法,所以要设置点击事件必须自己去写,关于具体写法我会再Demo中去更新。
废话不多说,下面我来介绍一下RecyclerView的简单用法,这里是以线性布局为例,最后又项目实例下载,不愿意看我废话的可以直接去下载。
1、现在Android开发最常用的就是Android Studio,所以这里也是以AS为例,首先我们要做的就是添加依赖,找到工程下的build.gradle,加入如下代码:
compile 'com.android.support:recyclerview-v7:23.3.0'
注意:版本号根据你自己的编译版本决定,一级版本号必须相同,二级版本号可以有差异,另外如果想让自己的列表的item有卡片式效果可以添加下面这个依赖,使用的时候直接用cardView控件包裹item布局即可。
compile 'com.android.support:cardview-v7:23.2.1'
2、添加依赖同步成功以后,在XML文件中 加入recyclerView控件如下,另外还需要一个列表的item布局,只需要一个TextView,这里我就不再多写了。
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
3、添加好依赖、写好布局,现在我们来看一下Java代码应该怎么写,实际上只需要三步
1)RecyclerView mRecyclerView = (RecyclerView)findViewById(R.id.recyclerView);
2)mRecyclerView.setLayoutManager(
new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
3) mRecyclerView.setAdapter(new MyAdapter(mList));
其中第一步就不必多说,第二步是设置布局的关键一步,setLayoutManager需要的参数就是RecyclerView.LayoutManager对象,这里我写的是匿名对象,也可以先声明LayoutManager对象写好配置再传进来。匿名LayoutManager对象有三个参数,第一个获取Activity;第二个参数设置方向,一般是VERTICAL,垂直滑动;第三个参数暂时用不到,写false就好。
代码如下:
private RecyclerView mRecyclerView;
private List<String> mListView = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recycler_view);
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
getData();
mRecyclerView.setAdapter(new MyAdapter(mListView));
}
//模拟数据
private void getData(){
for (int i = 0; i < 100; i++) {
mListView.add("RecyclerView列表"+i);
}
}
......
}
第三步中给RecyclerView添加适配器,这里需要注意的是RecyclerView类中已经提供了一个Adapter,所以我们不需要再使用BaseAdapter,同时Recycler还提供了一个内部的ViewHolder来进行优化。可以看到RecyclerView在Adapter中提供了三个重写方法onCreateHolderView、onBindHolderView、getItemCount,另外如果有需要还可以重写getItemViewType方法。从方法名字不难看出,onCreateViewHolder用于创建视图,onBindHolderView用户绑定数据,getItemCount用户获取项的数量。getItemViewType可以用于定制列表头部和尾部布局的时候使用,返回视图类型。
private static class ViewHolder extends RecyclerView.ViewHolder{
private TextView mTxt;
public ViewHolder(View itemView) {
super(itemView);
mTxt = (TextView) itemView.findViewById(R.id.item_txt);
}
}
private class MyAdapter extends RecyclerView.Adapter<ViewHolder>{
private List<String> mList;
public MyAdapter(List<String> mList) {
this.mList = mList;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View viewPager = getLayoutInflater().inflate(R.layout.item_list,parent,false);
ViewHolder mViewHolder = new ViewHolder(viewPager);
return mViewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mTxt.setText(mList.get(position));
}
@Override
public int getItemCount() {
return mList.size();
}
}
保存代码运行即可实现列表效果,如图
项目下载地址:https://github.com/fanKarl/recyclerview-master.git
在项目里我做了三种效果,第一种就是上边所讲方法;第二种则是列表头部自定制,如下图所示;第三种则是把RecyclerView的方法抽象成父类,由子类去继承,节约开发成本。
这里只是RecyclerView的简单介绍,如果大家想看具体的介绍,网上也是很有很多的,这里推荐一篇Blog,Frank-Zhu的RecyclerView使用详解
http://frank-zhu.github.io/android/2015/01/16/android-recyclerview-part-1/
补充----------------------------------------------------------------------
我写了一个带有刷新和点击事件的Demo。下载路径如下:
https://github.com/fanKarl/recyclerview-and-refresh-master