上次写了一篇recyclerview的简单使用方法:http://blog.csdn.net/allbule/article/details/52589397
这次想来再谈谈recyclerview,当我们想要实现在同一个recyclerview里面出现不同的Item项,我们该如何定制一个recyclerview。
定制recyclerview 涉及到俩个类,一个是RecyclerView.Adapter,以及RecyclerView.ViewHolder。
主要思想是这样的:RecyclerView里面有个getItemViewType(int position)方法。这个方法会将返回值传入onCreateViewHolder(ViewGroup container,int viewType)中作为viewType的值。
ViewHolder与Adapter
因此在RecyclerView.Adapter中我们可以这么写:
public abstract class BaseAdapter<T> extends RecyclerView.Adapter<ViewHolder>{
...
public BaseAdapter(Context context,int layoutId, List<T> list,RecyclerView recyclerView){
//do init there
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup container,int viewType){
if (viewType==TYPE_NORMAL) {
ViewHolder holder=ViewHolder.get(mContext,container,layoutId,-1);
return holder;
}else {
View view=LayoutInflater.from(mContext).inflate(R.layout.direction,container,false);
return new ViewHolder(mContext,view,-1);
}
}
@Override
public int getItemViewType(int position){
if (position%5==0){
return TYPE_DIERCTION;
}else {
return TYPE_NORMAL;
}
}
...
}
既然Adapter有俩个Item布局,那我们最好也用俩个不同的方法来构造对应的布局,这里我有俩种不同的方法来实现ViewHolder
一、在同一个ViewHolder里面,定义不同的ViewHolder的实例获取方法
public class ViewHolder extends RecyclerView.ViewHolder {
...
public ViewHolder(Context context, View itemView, ViewGroup parent, int position) {
super(itemView);
//这个构造方法用来装载normal type的item
}
public static ViewHolder get(Context context, View convertView,ViewGroup parent, int layoutId, int position) {
//实现你的逻辑,然后可以再调用这个ViewHolder装载不同Item返回 //这个构造方法用来装载direction的item
}
...
}
二、写俩个不同的ViewHolder子类实现不同的Item装载
主要思想就是分别写俩个类继承RecyclerView.ViewHolder,不同的type调用不同的ViewHolder。
RecyclerView.ItemDecoration
ItemDecoration主要是为RecyclerView添加装饰。通过实现RecyclerView.ItemDecoration的子类实现定制ItemDecoration。
ItemDecoration中有三个重要的方法:
①.getItemOffsets(Rect outRect,RecyclerView parent,RecyclerView.State state)
②.onDraw(Canvas c, RecyclerView parent, RecyclerView.State state)
③.onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state)
getItemOffsets相当于pandding,用来设置tem之间的位移,如:
@Override
public void getItemOffsets(Rect outRect,View view,RecyclerView parent,RecyclerView.State state){
outRect.set(0,0,0,5); //set(int left, int top, int right, int bottom)分别对应各个位置偏移出多少距离
}
onDraw()的绘制会先于ItemView的绘制,所以如果你在onDraw()方法中绘制的东西在ItemView边界内,就会被ItemView盖住。
而onDrawOver()会在ItemView绘制之后再绘制,所以如果你在onDrawOver()方法中绘制的东西在ItemView边界内,就会盖住ItemView。
然后调用
RecyclerView.addItemDecoration()方法为recyclerview添加ItemDecoration。
这样当recyclerview状态发生变化时,就会不断调用onDraw()或者onDrawOver()重绘界面。