目的
通过封装通用adapter精简以及更加快速的完成RecyclerView实现
- 基类通过模板方法,定义adapter行为
- 抽象绑定逻辑,绑定操作抽象在holder中
- holder点击事件设置,防止多次设置节约性能
实现
holder基类的实现
抽象基础bindHolder模板方法
通过bundle 传递额外参数固定方法入参
package com.android.app.commonadapter.holder;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
/**
*
* @param <T> 数据model泛型
*/
public abstract class AbsBaseHolder<T> extends RecyclerView.ViewHolder {
protected Context mContext;
public AbsBaseHolder(@NonNull View itemView) {
super(itemView);
mContext = itemView.getContext();
}
/**
*
* @param bean
* @param extra 通过bundle携带adapter额外绑定配置参数用于渲染view
* @param position
*/
public abstract void bindHolder(T bean, Bundle extra, int position);
}
adapter 基类
- 模板创建holder方法
- 固化绑定holder方法
package com.android.app.commonadapter;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import com.android.app.commonadapter.holder.AbsBaseHolder;
import com.android.app.commonadapter.itemlistener.OnItemClickListener;
import java.util.ArrayList;
import java.util.List;
/**
*
* @param <T> 数据model泛型
*/
public abstract class RvAbsBaseAdapter<T> extends RecyclerView.Adapter<AbsBaseHolder<T>> {
protected List<T> mDataList;
protected Context mContext;
protected OnItemClickListener<T> onItemClickListener;
public RvAbsBaseAdapter(Context context) {
this.mContext = context;
mDataList = new ArrayList<>();
}
public void setDataList(List<T> dataList) {
setDataList(dataList, true);
}
public void setDataList(List<T> dataList, boolean notifyDataSetChanged) {
mDataList.clear();
if (dataList != null) {
mDataList.addAll(dataList);
}
if (notifyDataSetChanged) {
notifyDataSetChanged();
}
}
public void setOnItemClickListener(OnItemClickListener<T> onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
@NonNull
@Override
public AbsBaseHolder<T> onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
final AbsBaseHolder<T> holder = createHolder(viewGroup, i);
if (holder == null) {
throw new RuntimeException("createHolder can not be null");
}
//绑定时设置点击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemClickListener != null && holder.getAdapterPosition() >= 0 ){
onItemClickListener.onItemClick(holder.itemView, mDataList.get(holder.getAdapterPosition()), holder.getAdapterPosition());
}
}
});
return holder;
}
/**
* 抽象创建holder方法交给子类实现
* @param viewGroup
* @param i
* @return
*/
public abstract AbsBaseHolder<T> createHolder(@NonNull ViewGroup viewGroup, int i);
/**
* 统一调用holder绑定方法绑定view
* @param tAbsBaseHolder
* @param i
*/
@Override
public void onBindViewHolder(@NonNull AbsBaseHolder<T> tAbsBaseHolder, int i) {
T bean = mDataList.get(i);
Bundle bundle = new Bundle();
tAbsBaseHolder.bindHolder(bean, bundle, i);
}
@Override
public int getItemCount() {
return mDataList.size();
}
}
adapter点击抽象
package com.android.app.commonadapter.itemlistener;
import android.view.View;
/**
*
* @param <T> 数据model泛型
*/
public interface OnItemClickListener<T> {
/**
*
* @param view 列表item View
* @param data 具体item model
* @param position 位置
*/
void onItemClick(View view, T data, int position);
}
使用
创建adapter
package com.android.app.sample.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.android.app.commonadapter.RvAbsBaseAdapter;
import com.android.app.commonadapter.holder.AbsBaseHolder;
import com.android.app.sample.R;
public class GalleryAdapter extends RvAbsBaseAdapter<String> {
public GalleryAdapter(Context context) {
super(context);
}
@Override
public AbsBaseHolder<String> createHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_gellary, viewGroup,false);
return new GalleryHolder(view);
}
}
创建holder
package com.android.app.sample.adapter;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.view.View;
import com.android.app.commonadapter.holder.AbsBaseHolder;
public class GalleryHolder extends AbsBaseHolder<String> {
public GalleryHolder(@NonNull View itemView) {
super(itemView);
}
@Override
public void bindHolder(String bean, Bundle extra, int position) {
}
}