簡單封裝
分析簡單調(diào)用之后架忌,看看什么部分是可以抽取出來弦赖,做一個BaseAdapter 的封裝。封裝 BaseAdapter 的目標就是再調(diào)用的時候能減少重復(fù)寫的代碼女蜈,提升 coding 的效率验烧。
回顧上篇說的簡單調(diào)用板驳,在使用 RecyclerView 的時候需要編寫 Adapter 和 ViewHolder 。在自己封裝的時候碍拆,參照 BaseRecyclerViewAdapterHelper 對Adapter的封裝實現(xiàn)若治。
封裝思路
在使用RecyclerView 的時候,如果不做封裝每次都得寫很多的代碼倔监。在簡單的使用我們只需要關(guān)注兩點:
1直砂、如何將 item layout 與Adapter 進行綁定。
2浩习、如何給 item layout 中的控件設(shè)置數(shù)據(jù)。
3济丘、如何不用每次都寫 ViewHolder谱秽。
最終達到的效果:
public class BaseTestAdapter extends BaseAdapter<BaseTestBean, BaseViewHolder> {
public BaseTestAdapter(List<BaseTestBean> datas) {
super(R.layout.layout_item_base_test,datas);
}
@Override
public void convert(BaseViewHolder holder, int position) {
BaseTestBean baseTestBean = getDatas().get(position);
holder.setText(R.id.tv_content,baseTestBean.getItemContent());
}
}
BaseAdapter 就是我們封裝好的 Adapter 基礎(chǔ)類。BaseViewHolder是對 ViewHolder 封裝摹迷。
Item layout 通過構(gòu)造函數(shù)傳遞綁定疟赊。數(shù)據(jù)也同時通過構(gòu)造函數(shù)傳遞到 Adapter中。數(shù)據(jù)展示通過 convert 進行展示以及處理峡碉。
BaseAdapter 封裝的整體代碼如下:
public abstract class BaseAdapter<K,T extends BaseViewHolder> extends RecyclerView.Adapter<T> {
private int layoutId;
private List<K> datas;
private OnItermClickLitener mOnItermClickLitener;
private OnItermLongClickListener mOnItermLongClickListener;
public BaseAdapter(int layoutId) {
this.layoutId = layoutId;
}
public BaseAdapter(int layoutId, List<K> datas) {
this.layoutId = layoutId;
this.datas = datas;
}
@NonNull
@Override
public T onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
T baseViewHolder = null;
View view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
baseViewHolder = (T) new BaseViewHolder(view);
bindViewClickListener(baseViewHolder);
return baseViewHolder;
}
@Override
public void onBindViewHolder(@NonNull T holder, int position) {
convert(holder,position);
}
@Override
public int getItemCount() {
return datas != null ? datas.size() : 0;
}
public List<K> getDatas() {
return datas;
}
public void setDatas(List<K> datas) {
this.datas = datas;
}
public void setOnItermClickLitener(OnItermClickLitener onItermClickLitener) {
mOnItermClickLitener = onItermClickLitener;
}
public void setOnItermLongClickListener(OnItermLongClickListener onItermLongClickListener) {
mOnItermLongClickListener = onItermLongClickListener;
}
protected void bindViewClickListener(final T viewHolder){
if(viewHolder == null) return;
View itemView = viewHolder.itemView;
if(itemView == null) return;
if(mOnItermClickLitener != null){
itemView.setOnClickListener(v -> {
int position = viewHolder.getAdapterPosition();
mOnItermClickLitener.onItermClick(BaseAdapter.this,v,position);
});
}
if(mOnItermLongClickListener != null){
itemView.setOnLongClickListener(v -> {
int position = viewHolder.getAdapterPosition();
boolean handler = mOnItermLongClickListener.onItermLongClick(BaseAdapter.this, v, position);
return handler;
});
}
}
public abstract void convert(T holder, int position);
public interface OnItermClickLitener{
void onItermClick(BaseAdapter adapter,View view,int position);
}
public interface OnItermLongClickListener{
boolean onItermLongClick(BaseAdapter adapter,View view,int position);
}
}
簡單的代碼封裝實現(xiàn)原理比較的簡單近哟,具體看代碼就可以理解,Base封裝完之后鲫寄,之后的項目就可以根據(jù)實際使用的情況進行更深一部的封裝或者擴展吉执。