背景:為了使項(xiàng)目更加整潔峻汉,利于開(kāi)發(fā),后期管理播赁,需要打造一款通用的recyclerview的適配器,功能要求:滿足不同數(shù)據(jù)內(nèi)容的適配吼渡;數(shù)據(jù)綁定部分簡(jiǎn)潔易懂容为;點(diǎn)擊事件和長(zhǎng)按事件監(jiān)聽(tīng);多條目布局的簡(jiǎn)單實(shí)現(xiàn)寺酪。學(xué)習(xí)于 鴻洋 的為RecyclerView打造通用Adapter 讓RecyclerView更加好用這篇博文坎背。
不同數(shù)據(jù)類型的適配使用泛型;
傳入布局id動(dòng)態(tài)填充寄雀;
在抽象方法中自定義數(shù)據(jù)綁定部分得滤;
接口回調(diào)事項(xiàng)點(diǎn)擊和長(zhǎng)按事件;
/**
* Created by whstywh on 2017/7/31.
* GitHub:https://github.com/whstywh
* email:whstywh@gmail.com
* description:通用Adapter
*/
public abstract class CommonRAdapter<T> extends RecyclerView.Adapter<CommonRAdapter.CommonViewHolder> {
protected Context mContext;
protected List<T> mList;
protected int mLayoutId;
protected LayoutInflater mLayoutInflater;
public OnItemClickListener mItemClickListener;
public OnLongClickListener mLongClickListener;
public CommonRAdapter(Context context, List<T> list, int layoutId) {
this.mContext = context;
this.mList = list;
this.mLayoutId = layoutId;
mLayoutInflater = LayoutInflater.from(mContext);
}
@Override
public CommonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mLayoutInflater.inflate(mLayoutId, parent, false);
CommonViewHolder holder = new CommonViewHolder(view, mContext);
return holder;
}
@Override
public void onBindViewHolder(CommonRAdapter.CommonViewHolder holder, int position) {
convert(holder, mList.get(position));
}
public abstract void convert(CommonViewHolder holder, T itemData);
@Override
public int getItemCount() {
return mList.size();
}
public interface OnItemClickListener {
void itemClick();
}
public interface OnLongClickListener {
boolean longClick();
}
public void setOnItemClickListener(OnItemClickListener itemClickListener) {
this.mItemClickListener = itemClickListener;
}
public void setOnLongClickListener(OnLongClickListener longClickListener) {
this.mLongClickListener = longClickListener;
}
}
使用SparseArray稀疏數(shù)組緩存view:因?yàn)镾parseArray也是通過(guò)鍵值對(duì)儲(chǔ)存盒犹,相比map集合有著占用內(nèi)存小的優(yōu)點(diǎn)懂更,用來(lái)替代Map<Integer,Objecty>;
通過(guò)傳入item中的viewId來(lái)獲取view:如果數(shù)組中沒(méi)有眨业,則findViewById并且緩存至數(shù)組中,方便下次獲染谛坛猪;
由于item的布局大多為TextView,ImageView皂股,所以封裝統(tǒng)一的set(),get()方法命黔;
/***
* ViewHolder
*/
public class CommonViewHolder extends RecyclerView.ViewHolder {
private SparseArray<View> mSparseArray;
public CommonViewHolder(View itemView, Context context) {
super(itemView);
mSparseArray = new SparseArray<>();
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mItemClickListener != null) {
mItemClickListener.itemClick();
}
}
});
itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return mLongClickListener == null ? false : mLongClickListener.longClick();
}
});
}
public CommonViewHolder setText(int viewId, CharSequence charSequence) {
TextView textView = getView(viewId);
textView.setText(charSequence);
return this;
}
public CommonViewHolder setImage(int viewId, CharSequence charSequence) {
ImageView imageView = getView(viewId);
Glide.with(mContext).load(charSequence).into(imageView);
return this;
}
private <T extends View> T getView(int viewId) {
View view = mSparseArray.get(viewId);
if (view == null) {
view = itemView.findViewById(viewId);
mSparseArray.put(viewId, view);
}
return (T) view;
}
}
多布局是通過(guò)自己來(lái)分配布局來(lái)實(shí)現(xiàn)的呜呐,定義接口并且在實(shí)例adapter的時(shí)候傳入實(shí)現(xiàn)對(duì)象,
自定義返回的itemType悍募,layoutId蘑辑;
/**
* Created by whstywh on 2017/7/31.
* GitHub:https://github.com/whstywh
* email:whstywh@gmail.com
* description:通用適配器—多條目布局
*/
public abstract class MultiItemCommonAdapter<T> extends CommonRAdapter<T> {
protected MultiItemTypeSupport<T> mMultiItemTypeSupport;
@Override
public int getItemViewType(int position) {
return mMultiItemTypeSupport.getItemViewType(position, mList.get(position));
}
public MultiItemCommonAdapter(Context context, List<T> list, int layoutId, MultiItemTypeSupport<T> multiTypeSupport) {
super(context, list, layoutId);
this.mMultiItemTypeSupport = multiTypeSupport;
}
@Override
public CommonRAdapter.CommonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
mLayoutId = mMultiItemTypeSupport.getLayoutId(viewType);
View view = mLayoutInflater.inflate(mLayoutId, parent, false);
CommonViewHolder holder = new CommonViewHolder(view, mContext);
return holder;
}
//接口
public interface MultiItemTypeSupport<T> {
int getLayoutId(int itemType);
int getItemViewType(int position, T t);
}
}