RecyclerView出现的时间已经有一段时间了,相应关注的同学应该都了解这个东西,下面我们谈两个问题:
1. RecyclerView相对于ListView有什么优势
2. RecyclerView的简单使用
先说第一个问题,都说RecyclerView很好用,那么它到底好用在哪里呢?
1. RecyclerView具有很强的自定义性,也就是我们可以定义RecyclerView每一行的Item个数,有点像是ListView和GridView的结合版。只不过他可以随意制定哪一行显示几个Item,够强大吧。
2. RecyclerView可以自定义Item的动画,比如说要做一个添加Item和删除Item的功能,你可以通过自定义动画实现添加删除操作时的一个动画缓冲。(这个功能我们暂且不谈,有兴趣的同学可以自己研究,或者等我的新分享)
3. 拥有内置的ViewHolder并且可以根据不同的Type类型加载不同的View。也就是说一个List列表可以有多种不同类型的View,只需一个RecyclerView就可以搞定。
上面的这三条决定了RecyclerView会逐渐取代ListView,那么RecyclerView如此强带我们该如何使用它呢?
首先导入v7的recyclerview包:
点击如下按钮
左边选择app,右边顶部选择Dependencies,然后我们看到右上角有个+,选择Library Dependencies搜索recyclerview,选择v7包下的那个:
点击后我们的Library就添加成功了,效果图如下:
下面我们就可以开始调用RecyclerView了。
布局部分跟实例化我们就不多说了,直接上设置Item个数的部分:
主要的部分注解已经写的很清楚了。
//设置布局管理为网格布局管理
final GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
mRecyclerView.setLayoutManager(gridLayoutManager);
//根据type类型设置每行的item数量
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup(){
@Override
public int getSpanSize(int position) {
int type = mRecyclerView.getAdapter().getItemViewType(position);
if(type == EvaluationModel.TYPE_ONE){
return gridLayoutManager.getSpanCount();
}else{
return 1;
}
}
});
Adapter:
package com.max.recycler.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import com.max.recycler.R;
import com.max.recycler.adapter.viewholder.BaseViewHolder;
import com.max.recycler.adapter.viewholder.TypeOneViewHolder;
import com.max.recycler.adapter.viewholder.TypeThreeViewHolder;
import com.max.recycler.adapter.viewholder.TypeTwoViewHolder;
import com.max.recycler.model.EvaluationModel;
import java.util.ArrayList;
import java.util.List;
/**
* RecyclerView的Adapter
*/
public class MyRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private LayoutInflater mInflater;
private List<EvaluationModel> mList = new ArrayList<>();
public MyRecyclerAdapter(Context mContext){
mInflater = LayoutInflater.from(mContext);
}
public void addList(List<EvaluationModel> list){
mList.addAll(list);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//根据viewType的类型判断返回不同的ViewHolder布局
switch (viewType){
case EvaluationModel.TYPE_ONE:
return new TypeOneViewHolder(mInflater.inflate(R.layout.viewholder_one,parent,false));
case EvaluationModel.TYPE_TWO:
return new TypeTwoViewHolder(mInflater.inflate(R.layout.viewholder_two,parent,false));
case EvaluationModel.TYPE_THREE:
return new TypeThreeViewHolder(mInflater.inflate(R.layout.viewholder_three,parent,false));
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//根据postion获取item数据半丁到ViewHolder
EvaluationModel model = mList.get(position);
//强制转换为BaseViewHolder,调用bindViewHolder方法绑定数据
((BaseViewHolder)holder).bindViewHolder(model);
}
@Override
public int getItemViewType(int position) {
return mList.get(position).mType;
}
@Override
public int getItemCount() {
return mList.size();
}
}
效果图如下: