闲来无事,将安卓上用于ListView的传统BaseAdapter按照RecyclerView.Adapter的写法分别继承做了一下统一。有这个想法主要是因为前段时间刚接触RecyclerView,就全部用RecyclerView代替了ListView来用,然而又担心万一RecyclerView不好用要换回ListView怎么办……当然最后证明这种担心多余了,但是之前的适配还是可以分享出来,比较初级,供初学者举一反三参考用。如下:
1.RecyclerView的容器适配基类:
public abstract class ExpoRecyclerAdapter<VH extends ExpoRecyclerAdapter.ViewHolder> extends RecyclerView.Adapter<VH>{
protected Context context;
@Override
public void onBindViewHolder(VH holder, int position){
holder.onBind(position);
}
public abstract class ViewHolder extends RecyclerView.ViewHolder{
private View rootView;
public View getView(int id){
return rootView.findViewById(id);
}
public View getRootView(){
return rootView;
}
public abstract void onBind(int position);
public ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
rootView = itemView;
}
}
}
用于ListView的容器适配基类:
public abstract class ExpoBaseAdapter<VH extends ExpoBaseAdapter.ViewHolder> extends BaseAdapter{
private HashMap<View, VH> holderKeeper = new HashMap<>();
@Override
public int getCount() {
return getItemCount();
}
@Override
public Object getItem(int i) {
return i;
}
@Override
public long getItemId(int i){
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
VH holder;
if(view == null){
holder = onCreateViewHolder(viewGroup, getItemViewType(i));
view = holder.rootView;
holderKeeper.put(view, holder);
view.setTag(holder);
}else{
holder = holderKeeper.get(view);
}
onBindViewHolder(holder, i);
return view;
}
public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);
public abstract void onBindViewHolder(VH holder, int position);
public abstract int getItemCount();
public abstract class ViewHolder{
public View rootView;
public View getRootView(){
return rootView;
}
public View getView(int id){
return rootView.findViewById(id);
}
public ViewHolder(View view){
this.rootView = view;
ButterKnife.bind(this, view);
}
}
}
public abstract class ExpoListAdapter<VH extends ExpoListAdapter.ViewHolder> extends ExpoBaseAdapter<VH>{
@Override
public void onBindViewHolder(VH holder, int position) {
holder.onBind(position);
}
public abstract class ViewHolder extends ExpoBaseAdapter.ViewHolder{
public ViewHolder(View view) {
super(view);
}
public abstract void onBind(int position);
}
}
经过这样的改写之后,ListView和RecyclerView的容器各自继承,当需要切换控件的时候,只需要将继承的父类改变一下,不需要改其他代码了,算是比较方便。