这两天再写一个例子的时候使用了RecyclerView,为了方便使用就对RecyclerView.Adapter 进行了简单的封装。
首先是写了一个BaseAdapter 类,继承了RecyclerView.Adapter
public abstract class BaseAdapter<T> extends RecyclerView.Adapter< BaseViewHolder > {
protected List mDateList; // TODO 数据源
protected Context mContext; // TODO 上下文
protected LayoutInflater mLayoutInflater;// TODO 数据源
protected View mView; // TODO 数据源
protected int currentPosition ; // 当前位置
public BaseAdapter(Context context, List list) {
mContext = context;
mDateList = list;
mLayoutInflater = LayoutInflater.from(mContext);
}
@Override
public int getItemCount() {
return mDateList.size();
}
}
很简单没什么好说的,看看 BaseViewHolder 类吧
public class BaseViewHolder extends RecyclerView.ViewHolder {
public SparseArray<ViewModel> mViewSparseArr = new SparseArray<>();
public BaseViewHolder(View itemView, SparseArray<ViewModel> viewSparseArr,int position) {
super(itemView);
ViewModel mViewModel = null;
for (int i = 0; i < viewSparseArr.size() ; i++) {
mViewModel = viewSparseArr.valueAt(i);
// 通过ViewModel 对象的id 初始化view 并设置View 交由mViewSparseArr 保管
mViewModel.setView(itemView.findViewById(mViewModel.getResID()));
mViewSparseArr.put(position, mViewModel);
}
}
}
BaseViewHolder 继承了 RecyclerView.ViewHolder 类,使用SparseArray 管理ViewModel 的对象, ViewModel 类的作用是保存一个Item 中的所有控件(你需要的),看看ViewModel 都有什么内容
public class ViewModel extends BaseModel {
private int mResID; // 控件id
private String mName;// 控件的名字
private View mView;// 控件
public ViewModel() {
}
public ViewModel(int mResID, String mName) {
this.mResID = mResID;
this.mName = mName;
}
public ViewModel(int mResID, String mName, View mView) {
this.mResID = mResID;
this.mName = mName;
this.mView = mView;
}
public ViewModel(Parcel in) {
super(in);
mResID = in.readInt();
mName = in.readString();
mView = (View) in.readSerializable();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mResID);
dest.writeString(mName);
dest.writeSerializable((Serializable) mView);
}
public int getResID() {
return mResID;
}
public void setResID(int mResID) {
if (mResID > 0) {
this.mResID = mResID;
} else {
new NullPointerException("ViewModel setmResID is zero('0') ");
}
}
public String getName() {
return mName;
}
public void setName(String mName) {
if (mName != null && mName.trim() != "") {
this.mName = mName;
} else {
new NullPointerException("ViewModel setmName is null");
}
}
public View getView() {
return mView;
}
public void setView(View mView) {
this.mView = mView;
}
}
实体类没什么好说的,不过需要注意 writeToParcel 方法 是因为BaseModel 使用了Parcelable 进行序列化,看看 BaseModel 吧
public class BaseModel implements Parcelable {
public BaseModel() {
}
public BaseModel(Parcel in) {
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
}
public static final Parcelable.Creator<BaseModel> CREATOR
= new Parcelable.Creator<BaseModel>() {
public BaseModel createFromParcel(Parcel in) {
return new BaseModel(in);
}
public BaseModel[] newArray(int size) {
return new BaseModel[size];
}
};
}
关于 使用Parcelable 进行序列化给 飞机票 ,记得自备梯子。
封装到此结束
下面看看 简单的使用
public class NavigationAdapter<T> extends BaseAdapter<BaseViewHolder> {
public NavigationAdapter(Context context, List list) {
super(context, list);
}
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
mView = mLayoutInflater.inflate(R.layout.item_navigation, null);
SparseArray<ViewModel> viewSparseArr = new SparseArray<>();
ViewModel mViewModel = new ViewModel(R.id.item_navigation_tv,"item_navigation_tv");
viewSparseArr.put(0, mViewModel);
return new BaseViewHolder(mView,viewSparseArr,currentPosition);
}
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
ViewModel mViewModel = holder.mViewSparseArr.get(position);
TextView mTv = (TextView) mViewModel.getView();
mTv.setText((CharSequence) mDateList.get(position));
currentPosition++;
}
}