RecycleView的适配器

1,单布局模式:

package com.shenbin.lvgvbaseadapter.recyc;


import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * RecyclerView单布局适配器封装类
 *
 * 封装了点击和长按事件
 *
 * 设置,添加,删除数据源的方法
 *
 * 使用抽象方法来给控件绑定数据
 *
 * Created by shenbin on 2015/12/25.
 */
public abstract class RecycLerBaseAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {


    private int resId;   //布局id
    private Context context = null;


    private List<T> datas = null;   //数据源


    private OnItemClickListener onItemClickListener;   //点击监听对象
    private OnItemLongClickListener onItemLongClickListener;   //长按监听对象


    public RecycLerBaseAdapter(Context context, int resId) {
        this.context = context;
        this.resId = resId;
        datas = new ArrayList<T>();
    }


    /**
     * 设置数据源的几个方法
     * @param datas
     */
    public void setDatas(List<T> datas){
        this.datas.clear();
        addDatas(datas);
    }


    public  void addDatas(List<T> datas){
        this.datas.addAll(datas);
        this.notifyDataSetChanged();
    }


    public void addOneData(T data){
        this.datas.add(data);
        this.notifyDataSetChanged();
    }


    /**
     * 删除数据源
     * @param index
     */
    public void remove(int index){
        this.datas.remove(index);
        this.notifyDataSetChanged();
    }


    /**
     * 删除所有数据
     */
    public void removeAllData(){
        this.datas.clear();
        this.notifyDataSetChanged();
    }


    public List<T> getDatas(){
        return this.datas;
    }




    /**
     * 找到item的布局,
     * 返回viewHolder对象。
     *
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {


        View view = View.inflate(context, resId, null);
        //View view = LayoutInflater.from(context).inflate(resId,parent,false);
        return new MyViewHolder(view);
    }


    /**
     * 绑定数据
     * @param viewHolder
     * @param position
     */
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        bindData((MyViewHolder)viewHolder,datas.get(position));
    }


    /**
     *用来给控件绑定数据
     * @param viewHolder
     * @param data
     */
    public abstract void bindData(MyViewHolder viewHolder,T data);


    @Override
    public int getItemCount() {
        return datas.size();
    }


    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {


        /**
         * 用来保存已经找到的控件,重用,实现优化。
         */
        private Map<Integer, View> itemCasher = new HashMap<Integer, View>();
        private View itemView = null;   //item的布局


        public MyViewHolder(View itemView) {
            super(itemView);
            this.itemView = itemView;
            this.itemView.setOnClickListener(this);   //点击监听
            this.itemView.setOnLongClickListener(this);  //从长按监听
        }


        /**
         * 获取控件
         * @param viewId
         * @return
         */
        public View getView(int viewId){
            View view = null;


            if (itemCasher.containsKey(viewId)){
                view = itemCasher.get(viewId);
            }else {
                view = this.itemView.findViewById(viewId);
                itemCasher.put(viewId,view);
            }
            return  view;
        }


        /**
         * 实现对应的item的控件的点击事件
         * @param v
         */
        @Override
        public void onClick(View v) {
            if(onItemClickListener != null){
                //把点击的控件和相应的位置信息绑定起来
                onItemClickListener.onItemClick(v, getPosition());
            }
        }


        /**
         * 实现对应控件的长按事件
         * @param v
         * @return
         */
        @Override
        public boolean onLongClick(View v) {
            if(onItemLongClickListener != null){
                //getAdapterPosition()
                onItemLongClickListener.onItemLongClick(v, getPosition());
            }
            return false;
        }
    }


    /**
     * 点击接口
     */
    public interface OnItemClickListener{
        public void onItemClick(View v,int positon);
    }


    /**
     * 长按接口
     */
    public interface OnItemLongClickListener{
        void onItemLongClick(View v, int position);
    }




    public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
        this.onItemLongClickListener = onItemLongClickListener;
    }


    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

}


2,多布局模式:

package com.shenbin.lvgvbaseadapter.recyc;


import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;


/**
 * RecyclerView多布局适配器封装类
 *
 * 封装了点击和长按事件
 *
 * 设置,添加,删除数据源的方法
 *
 * 使用抽象方法来给控件绑定数据
 *
 * Created by shenbin on 2015/12/25.
 */
public abstract class RecycLerBaseAdapterMore<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {


    private int[] resId;   //布局id
    private Context context = null;


    private List<T> datas = null;   //数据源


    private OnItemClickListener onItemClickListener;   //点击监听对象
    private OnItemLongClickListener onItemLongClickListener;   //长按监听对象


    public RecycLerBaseAdapterMore(Context context, int... resId) {
        this.context = context;
        this.resId = resId;
        datas = new ArrayList<T>();
    }


    /**
     * 设置数据源的几个方法
     * @param datas
     */
    public void setDatas(List<T> datas){
        this.datas.clear();
        addDatas(datas);
    }


    public  void addDatas(List<T> datas){
        this.datas.addAll(datas);
        this.notifyDataSetChanged();
    }


    public void addOneData(T data){
        this.datas.add(data);
        this.notifyDataSetChanged();
    }


    /**
     * 删除数据源
     * @param index
     */
    public void remove(int index){
        this.datas.remove(index);
        this.notifyDataSetChanged();
    }


    /**
     * 删除所有数据
     */
    public void removeAllData(){
        this.datas.clear();
        this.notifyDataSetChanged();
    }


    public List<T> getDatas(){
        return this.datas;
    }




    /**
     * 这个方法的返回值只能从0开始,否则会有一些莫名的错误,并且从0,开始递增(0,1,2,3,4),不能一下从0,2,4;
     *
     * 第一种方式:
     * (这是采用映射的方式实现)
     * 强制,T这个实体类中 必须有一个名字叫做type的属性
     *
     *
     * 如果不理解的可以用第二种方式:
     * 在自己的adapter中重写这个方法,自己去定义规则。
     * 如:
     *
     * if( positon %2 ==0){
     *     return 0;
     * }else{
     *     return 1;
     * }
     *
     *
     * @param position
     * @return
     */
    @Override
    public int getItemViewType(int position) {
        T data = datas.get(position);
        Class c = data.getClass();
        int ty = 0;
        try {
            Field type = c.getDeclaredField("type");
            type.setAccessible(true);
            ty = type.getInt(data);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ty;
    }


    /**
     * 找到item的布局,
     * 返回viewHolder对象。
     *
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {


        View view = View.inflate(context, resId[viewType], null);
        //View view = LayoutInflater.from(context).inflate(resId,parent,false);
        return new MyViewHolder(view);
    }


    /**
     * 绑定数据
     * @param viewHolder
     * @param position
     */
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        bindData((MyViewHolder)viewHolder,datas.get(position));
    }


    /**
     *用来给控件绑定数据
     * @param viewHolder
     * @param data
     */
    public abstract void bindData(MyViewHolder viewHolder,T data);


    @Override
    public int getItemCount() {
        return datas.size();
    }


    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {


        /**
         * 用来保存已经找到的控件,重用,实现优化。
         */
        private Map<Integer, View> itemCasher = new HashMap<Integer, View>();
        private View itemView = null;   //item的布局


        public MyViewHolder(View itemView) {
            super(itemView);
            this.itemView = itemView;
            this.itemView.setOnClickListener(this);   //点击监听
            this.itemView.setOnLongClickListener(this);  //从长按监听
        }


        /**
         * 获取控件
         * @param viewId
         * @return
         */
        public View getView(int viewId){
            View view = null;


            if (itemCasher.containsKey(viewId)){
                view = itemCasher.get(viewId);
            }else {
                view = this.itemView.findViewById(viewId);
                itemCasher.put(viewId,view);
            }
            return  view;
        }


        /**
         * 实现对应的item的控件的点击事件
         * @param v
         */
        @Override
        public void onClick(View v) {
            if(onItemClickListener != null){
                //把点击的控件和相应的位置信息绑定起来
                onItemClickListener.onItemClick(v, getPosition());
            }
        }


        /**
         * 实现对应控件的长按事件
         * @param v
         * @return
         */
        @Override
        public boolean onLongClick(View v) {
            if(onItemLongClickListener != null){
                //getAdapterPosition()
                onItemLongClickListener.onItemLongClick(v, getPosition());
            }
            return false;
        }
    }


    /**
     * 点击接口
     */
    public interface OnItemClickListener{
        public void onItemClick(View v, int positon);
    }


    /**
     * 长按接口
     */
    public interface OnItemLongClickListener{
        void onItemLongClick(View v, int position);
    }




    public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
        this.onItemLongClickListener = onItemLongClickListener;
    }


    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

}


3,添加头部和底部:

package com.shenbin.lvgvbaseadapter.recyc;


import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * RecyclerView单布局适配器封装类
 *
 * 封装了点击和长按事件
 *
 * 设置,添加,删除数据源的方法
 *
 * 使用抽象方法来给控件绑定数据
 *
 * 添加了两个方法:  添加头部和添加尾部的方法。
 *
 * Created by shenbin on 2015/12/25.
 */
public abstract class RecycLerBaseAdapterHeadAndFoot<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {


    private int resId;   //布局id
    private Context context = null;


    private List<T> datas = null;   //数据源


    private View headView = null;   //头部布局
    private View footView = null;   //底部布局


    private int headSize = 0;
    private int footSize = 0;


    private static int Normal = 0;
    private static int Head = 1;
    private static int Foot = 2;
    private int type = Normal;




    private OnItemClickListener onItemClickListener;   //点击监听对象
    private OnItemLongClickListener onItemLongClickListener;   //长按监听对象


    public RecycLerBaseAdapterHeadAndFoot(Context context, int resId) {
        this.context = context;
        this.resId = resId;
        datas = new ArrayList<T>();
    }


    /**
     * 设置数据源的几个方法
     * @param datas
     */
    public void setDatas(List<T> datas){
        this.datas.clear();
        addDatas(datas);
    }


    public  void addDatas(List<T> datas){
        this.datas.addAll(datas);
        this.notifyDataSetChanged();
    }


    public void addOneData(T data){
        this.datas.add(data);
        this.notifyDataSetChanged();
    }


    /**
     * 删除数据源
     * @param index
     */
    public void remove(int index){
        this.datas.remove(index);
        this.notifyDataSetChanged();
    }


    /**
     * 删除所有数据
     */
    public void removeAllData(){
        this.datas.clear();
        this.notifyDataSetChanged();
    }


    public List<T> getDatas(){
        return this.datas;
    }


    public void addHeadView(View headView){
        this.headView = headView;
        headSize = 1;
    }


    public void addFootView(View footView){
        this.footView = footView;
        footSize = 1;
    }


    @Override
    public int getItemViewType(int position) {


        if(position !=0 && position != getItemCount()-1){
           type = Normal;
        }else if(position == 0 && headView != null){
            type = Head;
        }else if(position == getItemCount() - 1 && footView != null){
            type = Foot;
        }


        return  type;
    }


    /**
     * 找到item的布局,
     * 返回viewHolder对象。
     *
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {


        View view = null;


        if(viewType == Normal){
            view = View.inflate(context, resId, null);
            //View view = LayoutInflater.from(context).inflate(resId,parent,false);
        }else if(viewType == Head){
            view = headView;
        }else if(viewType == Foot){
            view = footView;
        }
        return new MyViewHolder(view);
    }


    /**
     * 绑定数据
     * @param viewHolder
     * @param position
     */
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {


        if(headView == null && footView == null){
            bindData((MyViewHolder)viewHolder,datas.get(position));
        }else if(headView == null && footView != null){
            //有尾部,没头部
            if(position < getItemCount()-1){
                bindData((MyViewHolder)viewHolder,datas.get(position));
            }
        }else if(headView != null && footView == null){
            //有头部没尾部
            if( position < getItemCount()){
                if(position != 0){
                    bindData((MyViewHolder)viewHolder,datas.get(position - 1));
                }


            }
        }else if( headView != null && footView != null){
            //有头有尾
            if(position != 0 && position != getItemCount() -1){
                bindData((MyViewHolder)viewHolder,datas.get(position -1));
            }
        }




    }


    /**
     *用来给控件绑定数据
     * @param viewHolder
     * @param data
     */
    public abstract void bindData(MyViewHolder viewHolder,T data);


    @Override
    public int getItemCount() {
        return datas.size()+headSize+footSize;
    }


    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {


        /**
         * 用来保存已经找到的控件,重用,实现优化。
         */
        private Map<Integer, View> itemCasher = new HashMap<Integer, View>();
        private View itemView = null;   //item的布局


        public MyViewHolder(View itemView) {
            super(itemView);
            this.itemView = itemView;
            this.itemView.setOnClickListener(this);   //点击监听
            this.itemView.setOnLongClickListener(this);  //从长按监听
        }


        /**
         * 获取控件
         * @param viewId
         * @return
         */
        public View getView(int viewId){
            View view = null;


            if (itemCasher.containsKey(viewId)){
                view = itemCasher.get(viewId);
            }else {
                view = this.itemView.findViewById(viewId);
                itemCasher.put(viewId,view);
            }
            return  view;
        }


        /**
         * 实现对应的item的控件的点击事件
         * @param v
         */
        @Override
        public void onClick(View v) {
            if(onItemClickListener != null){
                //把点击的控件和相应的位置信息绑定起来
                onItemClickListener.onItemClick(v, getPosition());
            }
        }


        /**
         * 实现对应控件的长按事件
         * @param v
         * @return
         */
        @Override
        public boolean onLongClick(View v) {
            if(onItemLongClickListener != null){
                //getAdapterPosition()
                onItemLongClickListener.onItemLongClick(v, getPosition());
            }
            return false;
        }
    }


    /**
     * 点击接口
     */
    public interface OnItemClickListener{
        public void onItemClick(View v, int positon);
    }


    /**
     * 长按接口
     */
    public interface OnItemLongClickListener{
        void onItemLongClick(View v, int position);
    }




    public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
        this.onItemLongClickListener = onItemLongClickListener;
    }


    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }




}


4,设置分割线:

package com.shenbin.lvgvbaseadapter.recyc;


import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.RecyclerView;
import android.view.View;


/**
 * 作用:
 * 实现RecyclerView分隔线
 *
 * Created by shenbin on 2015/12/25.
 */
public class RecycItemLine extends RecyclerView.ItemDecoration{


    // 系统默认分隔符资源的ID
    private static final int[] ATTRS = {android.R.attr.listDivider};
    // 分隔条Drawable对象
    private Drawable mDivider;


    // 构造函数初始化
    public RecycItemLine(Context context) {
        TypedArray typedArray = context.obtainStyledAttributes(ATTRS);
        // 获得系统提供的分隔条Drawable对象
        mDivider = typedArray.getDrawable(0);
        // 回收typedArray所占用的资源
        typedArray.recycle();
    }


    // 绘制所有列表项之间的分隔条
    @Override
    public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
        // 获取列表项距离左边缘的距离
        int left = parent.getPaddingLeft();


        // 获取列表项距离右边缘的距离
        int right = parent.getWidth() - parent.getPaddingRight();


        // 获取列表项的总数
        int childCount = parent.getChildCount();


        // 绘制所有的列表项之间的分割线
        for (int i = 0; i < childCount; i++) {
            // 获得当前的列表项
            View child = parent.getChildAt(i);


            // 获得当前列表项的布局参数信息
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();


            // 计算分隔条左上角的纵坐标
            int top = child.getBottom() + params.bottomMargin;


            // 计算分隔条右下角的纵坐标
            int bottom = top + mDivider.getIntrinsicHeight();


            // 设置分隔条的绘制范围
            mDivider.setBounds(left, top, right, bottom);


            // 开始绘制当前列表项下面的分隔条
            mDivider.draw(canvas);


        }
    }
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值