再谈RecyclerView

上次写了一篇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()重绘界面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值