最近在攻读陈宇明大佬的万能适配器,按照自己的编码习惯写了一个demo,在这里分享一下。
下一篇将会拓展ImageView三级缓存加载网络图片,后续会对ImageView大小做适配,类似Glide加载图片
一、自定义适配器
自定义适配器要重写的重要方法有构造函数、onCreateViewHolder方法和onBindViewHolder方法
构造函数至少需要两个参数,参数1:item的布局文件,参数2:item的数据集合
onCreateViewHolder方法通过viewGroup.getContext()获取上下文并加载布局文件;baseViewHolder.setAdapter(this, application)则为自定义ViewHolder做准备
onBindViewHolder方法为子类提供了抽象方法convert,实现了item的点击事件
public abstract class BaseRecyclerViewAdapter<T,K extends BaseViewHolder> extends RecyclerView.Adapter<K>{
private int resource;
private List<T> data;
private Context context;
public BaseRecyclerViewAdapter(@LayoutRes int resource, @Nullable List<T> data){
this.data = data == null ? new ArrayList<T>() : data;
if (resource != 0) {
this.resource = resource;
}
}
public Context getContext(){
return context;
}
/**
* item 点击事件
*/
private OnItemClickListener onItemClickListener;
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
/**
* item 长按事件
*/
private OnItemLongClickListener onItemLongClickListener;
public interface OnItemLongClickListener {
void onItemLongClick(View view, int position);
}
public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
this.onItemLongClickListener = onItemLongClickListener;
}
/**
* item中子view的点击事件
* 必须先在adapter的convert方法里面通过viewHolder.addOnClickListener绑定一下的控件id
*/
private OnItemChildClickListener mOnItemChildClickListener;
public interface OnItemChildClickListener {
void onItemChildClick(BaseRecyclerViewAdapter adapter, View view, int position);
}
public void setOnItemChildClickListener(OnItemChildClickListener listener) {
mOnItemChildClickListener = listener;
}
@Nullable
public final OnItemChildClickListener getOnItemChildClickListener() {
return mOnItemChildClickListener;
}
/**
* item中子view的长按事件
* 必须先在adapter的convert方法里面通过viewHolder.addOnLongClickListener绑定一下的控件id
*/
private OnItemChildLongClickListener mOnItemChildLongClickListener;
public interface OnItemChildLongClickListener {
/**
* 长按事件
* @return 如果回调消耗了长按,则返回true,否则返回false
*/
boolean onItemChildLongClick(BaseRecyclerViewAdapter adapter, View view, int position);
}
public void setOnItemChildLongClickListener(OnItemChildLongClickListener listener) {
mOnItemChildLongClickListener = listener;
}
@Nullable
public final OnItemChildLongClickListener getOnItemChildLongClickListener() {
return mOnItemChildLongClickListener;
}
@NonNull
@Override
public K onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
context = viewGroup.getContext();
Application application = (Application) context.getApplicationContext();
K baseViewHolder = (K) new BaseViewHolder(LayoutInflater.from(context).inflate(resource, null, false));
baseViewHolder.setAdapter(this, application);
return baseViewHolder;
}
@Override
public void onBindViewHolder(@NonNull K holder, int position) {
T item = null;
if (position >&