- 使用Recyclerview已经有一段时间了,打算把自己项目中用到的知识点写成一个系列,作为自己技术成长的一个记录,今天简单写一下Adapter与Holder的封装。
如果我想实现一张如下的列表

封装之前的代码
- NormalAdapter的代码
public class NormalAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<String> mList;
private RvListener mRvListener;
private Context mContext;
private LayoutInflater mLayoutInflater;
public NormalAdapter(List<String> list, Context context, RvListener rvListener) {
mList = list;
mRvListener = rvListener;
mContext = context;
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mLayoutInflater.inflate(R.layout.item_demo, parent, false);
return new NormalHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
((NormalHolder) holder).tvDemo.setText(mList.get(position));
}
@Override
public int getItemCount() {
return mList == null ? 0 : mList.size();
}
private class NormalHolder extends RecyclerView.ViewHolder {
private TextView tvDemo;
NormalHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mRvListener.onItemClick(v.getId(), getAdapterPosition());
}
});
tvDemo = (TextView) itemView.findViewById(R.id.tv_demo);
}
}
}
代码优化
- 对象复用:Adapter中的List,RvListener,Context,LayoutInflater都可以抽取到一个父类里面,List可以用泛型进行限定
- 监听事件:Holer中的点击事件是每个Recyclerview都需要的,可以进行抽取Holder到父类,实现Holder的解耦
- 分离Holder:holder里面主要是进行View的初始化操作以及数据的绑定,抽取出来之后逻辑更加清晰
重构后的代码
- RvAdapter
public abstract class RvAdapter<T> extends RecyclerView.Adapter<RvHolder> {
protected List<T> list;
protected Context mContext;
protected RvListener listener;
protected LayoutInflater mInflater;
public RvAdapter(Context context, List<T> list, RvListener listener) {
mContext = context;
mInflater = LayoutInflater.from(context);
this.list = list;
this.listener = listener;
}
@Override
public RvHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return getHolder(parent, viewType);
}
@Override
public void onBindViewHolder(RvHolder holder, int position) {
holder.bindHolder(list.get(position), position);
}
@Override
public int getItemCount() {
return list.size();
}
@Override
public int getItemViewType(int position) {
return 0;
}
protected abstract RvHolder getHolder(ViewGroup parent, int viewType);
}
- RvHolder
public abstract class RvHolder<T> extends RecyclerView.ViewHolder {
private RvListener mListener;
public RvHolder(View itemView, int type, RvListener listener) {
super(itemView);
this.mListener = listener;
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onItemClick(v.getId(), getAdapterPosition());
}
});
}
public abstract void bindHolder(T t, int position);
}
- NormalAdapter
public class NormalAdapter extends RvAdapter<String> {
public NormalAdapter(Context context, List<String> list, RvListener listener) {
super(context, list, listener);
}
@Override
protected RvHolder getHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.item_demo, parent, false);
return new NormalHolder(view, viewType, listener);
}
}
- NormalHolder
public class NormalHolder extends RvHolder<String> {
private TextView tvDemo;
public NormalHolder(View itemView, int type, RvListener listener) {
super(itemView, type, listener);
tvDemo = (TextView) itemView.findViewById(R.id.tv_demo);
}
@Override
public void bindHolder(String s, int position) {
tvDemo.setText(s);
}
}
总结
- 搞Android开发,java基础的确很重要,封装,继承,多态这些如果能够灵活运用可以让开发高效很多。
- 不能以战术上的勤奋代理战略上的懒惰,规划好了往往能事半功倍。
- 任何事情都是小马过河,去做了,才发现没有那么难,也没有那么简单。
网友评论