源碼:RecyclerView的萬能Adapter
其餘廢話不說了,看代碼:
封裝 Adapter 部分
public abstract class RecyclerCommonAdapter<T> extends RecyclerView.Adapter<ViewHolder> {
//item資源ID
private int mLayoutId;
//通用參數那麼隻能使用泛型
private List<T> mList;
//執行個體化View的LayoutInflate
private LayoutInflater mInflater;
//多布局支援
private MultiTypeSupport<T> mMultiTypeSupport;
public RecyclerCommonAdapter(Context context, List<T> list, int layoutId) {
this.mInflater = LayoutInflater.from(context);
this.mList = list;
this.mLayoutId = layoutId;
}
/**
* 多布局支援
*/
public RecyclerCommonAdapter(Context context, List<T> data, MultiTypeSupport<T> multiTypeSupport) {
this(context, data, -1);
this.mMultiTypeSupport = multiTypeSupport;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//需要多布局
if (mMultiTypeSupport != null) {
mLayoutId = viewType;
}
//建立View
View itemView = mInflater.inflate(mLayoutId, parent, false);
final ViewHolder viewHolder = new ViewHolder(itemView);
// 設定點選事件
if (mItemClickListener != null) {
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (viewHolder.getAdapterPosition() == RecyclerView.NO_POSITION) {
return;
}
mItemClickListener.onItemClick(v, viewHolder.getAdapterPosition());
}
});
}
//設定長按事件
if (mItemLongClickListener != null) {
itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (viewHolder.getAdapterPosition() == RecyclerView.NO_POSITION) {
return false;
}
return mItemLongClickListener.onItemLongClick(v, viewHolder.getAdapterPosition());
}
});
}
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
//綁定ViewHolder
convert(holder, mList.get(position), position);
}
/**
* 根據目前位置擷取不同的viewType
*/
@Override
public int getItemViewType(int position) {
if (mMultiTypeSupport != null) {
return mMultiTypeSupport.getLayoutId(mList.get(position));
}
return super.getItemViewType(position);
}
/**
* 綁定資料
*
* @param holder
* @param item 目前資料
* @param position 目前位置索引
*/
protected abstract void convert(ViewHolder holder, T item, int position);
@Override
public int getItemCount() {
return mList.size();
}
/**
* 設定點選和長按事件回調
*/
private OnItemClickListener mItemClickListener;
private OnItemLongClickListener mItemLongClickListener;
public void setOnItemClickListener(OnItemClickListener listener) {
this.mItemClickListener = listener;
}
public void setOnItemLongClickListener(OnItemLongClickListener listener) {
this.mItemLongClickListener = listener;
}
}
ViewHolder部分
public class ViewHolder extends RecyclerView.ViewHolder {
//緩存ViewHolder中子View減少findViewById的次數
private SparseArray<View> mViews = new SparseArray<>();
public ViewHolder(View itemView) {
super(itemView);
}
/**
* 通過viewId擷取控件
*
* @param viewId
* @param <T>
* @return
*/
public <T extends View> T getView(int viewId) {
//多次findViewById,對已有的View進行緩存
View view = mViews.get(viewId);
//使用緩存的方式減少findViewById的次數
if (view == null) {
view = itemView.findViewById(viewId);
mViews.put(viewId, view);
}
if (view == null) {
throw new NullPointerException("layout中不存在該viewId = " + viewId);
}
return (T) view;
}
/**
* 通用的功能進行封裝
* 設定點選事件
* 采用鍊式調用
*
* @param viewId
* @param onClickListener
* @return
*/
public ViewHolder setOnClickListener(int viewId, View.OnClickListener onClickListener) {
View view = getView(viewId);
view.setOnClickListener(onClickListener);
return this;
}
/**
* 通用的功能進行封裝
* 設定文本
* 采用鍊式調用
*
* @param viewId
* @param text
* @return
*/
public ViewHolder setText(int viewId, CharSequence text) {
TextView textView = getView(viewId);
textView.setText(text);
return this;
}
/**
* 通用的功能進行封裝
* 設定圖檔資源
* 采用鍊式調用
*
* @param viewId
* @param resourceId
* @return
*/
public ViewHolder setImageResource(int viewId, int resourceId) {
ImageView imageView = getView(viewId);
imageView.setImageResource(resourceId);
return this;
}
/**
* 通用的功能進行封裝 圖檔加載處理
* 設定接口回調
* 采用鍊式調用
*
* @param viewId
* @param path
* @param imageLoader
* @return
*/
public ViewHolder setImagePath(int viewId, String path, HolderImageLoader imageLoader) {
//使用第三方網絡加載架構進行封裝
ImageView imageView = getView(viewId);
imageLoader.loadImage(imageView, path);
return this;
}
/**
* 圖檔的加載接口
*/
public interface HolderImageLoader {
/**
* 加載圖檔
*
* @param imageView
* @param path
*/
void loadImage(ImageView imageView, String path);
}
}
代碼部分就這麼多,有興趣的童鞋可以對照着自己寫一遍。
PS:希望自己技術越來越牛逼!!!