RecyclerView.Adapter 的简单封装

这两天再写一个例子的时候使用了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++; 

    }

}
欢迎指正! email:704084109@qq.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值