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,添加头部和底部:
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,设置分割线:
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);
}
}
}