Android学习笔记之RecyclerView详解
RecyclerView是什么?
在android5.0,开始出现了一些新特性,其中就包括了非常受欢迎的RecyclerView。RecyclerView是一种新的视图组,其目的是为任何基于适配器的视图提供相似的渲染方式。该控件用于在有限的窗口中展示大量数据集,它被作为ListView和GirdView控件的继承者。RecyclerView高度接耦,异常的灵活,通过设置不同的LayoutManager,ItemDecoration,ItemAnimator来实现令人想象不到的效果。
2.RecyclerView的用法:
自从RecyclerView的出现,慢慢的ListView 和 GridView开始要面向淘汰的边缘了。因为RecyclerView不仅仅能替代ListView和GridView,而且还具有很多你想象不到的效果,那么具体的效果,下面开始慢慢的介绍吧,先看看他的一些基本用法。
Datas : 要显示的数据
Adapter:适配器,绑定数据集
ViewHolder:根据当前的数据保存视图
LayoutManager:布局管理器,决定item如何摆放
ItemDecoration:对item的装饰,美化item,
ItemAnimator:动画(当item被增加、删除、重新摆放时才有效)
Listener:事件,对于事件,RecyclerView本身不提供,只得自己去实现
对于RecyclerView我们现在要掌握的主要就是他的三种管理形式:
2.1 LinearLayoutManager
线性布局,LayoutManager的实现类,类似于实现ListView的风格,一般
ListView只有垂直的方向,而这里可包含两种类型,Vertical和Horizontal
2.2 GridLayoutManager
格子布局、继承自LinearLayoutManager,实现效果类似GridView
2.3 StaggeredGridLayoutManager
交错的格子布局、同样也是LayoutManager的实现类,类型包括Vertical和Horizontal,与GridLayoutManager很相似,不过是交错的格子,也就是宽高不等的格子视图、类似瀑布流的效果。
其次,我们需要掌握他的一些点击和长按事件,对于RecyclerView其本身没有给我们提供这些事件监听,所以,对于这些事件,我们还得自己去实现。
3. 首先先看看类似于ListView的布局实现。
基本步奏:(由于这是新特性包中给我们提供的,所以我们需要先导入RecyclerView依赖包)
在build.gradle中添加如下一句代码,记住,是对应module下面的build.gradle,不是project下的build.gradle
dependencies {
.....
//添加此依赖
compile 'com.android.support:recyclerview-v7:24.2.1'
}
3.1 在布局文件中添加RecyclerView控件
3.2 创建item的子布局,和ListView一样,需要有一个item对应的子布局
3.3 创建适配器
3.4 创建并设置对应的布局管理器
3.5 设置Adapter适配器
具体代码实现如下:
activity_main_list.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/mRecyclerList"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
recycler_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="center"
android:background="@color/colorAccent"
android:padding="15dp">
<TextView
android:id="@+id/mItem"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" />
</LinearLayout>
这里我们需要注意一下布局中的几个参数的区别,在ListView中,(假如也是使用上面的布局)不管你对layout_width 和layout_height设置为wrap_content也好还是match_parent,对item的高度都不会有什么影响,因为ListView会对你的item布局进行管理,所以你设置的高宽会无效,但是如果在RecyclerView中,设置对应的item高宽度的话,那么是会有影响的,因为RecyclerView不会去管理你的item布局,它只会按你设置的具体情况来显示。假如,你设置layout_height为match_parent,那么最后的显示效果是,你的整个一个界面中就只有一个布局item。也就是说这个item布局会占满整个屏幕。
创建自定义的适配器
MyRecylerAdapter.java
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder> {
//数据源
private List<String> mData;
//上下文
private Context mContext;
//布局解析器
private LayoutInflater mInflater;
public MyRecyclerAdapter(Context context, List<String> data){
mContext = context;
mData = data;
mInflater = LayoutInflater.from(mContext);
}
//创建ViewHolder,相当于ListView Adapter的getView方法
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = mInflater.inflate(R.layout.recycler_item,parent,false);
return new ViewHolder(itemView);
}
//数据绑定
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mText.setText(mData.get(position));
}
//数据的长度
@Override
public int getItemCount() {
return mData == null ? 0 : mData.size();
}
//ViewHolder,需要继承RecyclerView.ViewHolder
public static class ViewHolder extends RecyclerView.ViewHolder{
private TextView mText;
public ViewHolder(View itemView) {
super(itemView);
mText = (TextView)itemView.findViewById(R.id.mItem);
}
}
}
创建并设置对应的布局管理器和适配器
public class MainActivityRecyclerViewList extends AppCompatActivity {
private RecyclerView mRecycler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_list);
//查找控件ID
mRecycler = (RecyclerView)findViewById(R.id.mRecyclerList);
//创建布局管理器
LinearLayoutManager manager = new LinearLayoutManager(this);
//设置布局管理器,默认item方向为垂直
mRecycler.setLayoutManager(manager);
//创建适配器
MyRecyclerAdapter adapter = new MyRecyclerAdapter(this, getData());
//设置适配器
mRecycler.setAdapter(adapter);
}
//设置数据源
public List<String> getData() {
List<String> data = new ArrayList<>();
for(int i = 0; i