[Android] RecyclerAdapter 的簡單封裝

在 5.0 后 google 推出了用于替代 ListView 的新控件 --- RecyclerView。

至于這么用,在這就不多說了,資料很多。 這里我們主要來看看關(guān)于 RecyclerAdapter 的封裝 。

RecyclerView 確實(shí)很好用,靈活自由,但是也因此代碼量相對 ListView 會(huì)比較多。并且沒有現(xiàn)成的 Adapter 使用 ,就算是顯示簡單的文本列表,也需要重寫。那么為了方便使用。我們可以對 RecyclerAdapter 進(jìn)行簡單的封裝。在此基礎(chǔ)上,可以根據(jù)個(gè)人項(xiàng)目需求進(jìn)行更多復(fù)雜的封裝。

來看代碼吧

public abstract class BaseRecyclerAdapter<T, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
    protected List<T> mDatas = new ArrayList<>();
    protected Context mContext;
    protected LayoutInflater inflater;
    AdapterView.OnItemClickListener mItemClickListener;

    public BaseRecyclerAdapter(List<T> mDatas, Context mContext) {
        this.mDatas = mDatas;
        this.mContext = mContext;
        inflater = LayoutInflater.from(mContext);
    }

    @Override
    public void onBindViewHolder(VH holder, int position) {
        T item = getItem(position);
        bindItemData(holder, item, position);
        setupOnItemClick(holder, position);
    }

    protected abstract void bindItemData(VH viewHolder, T data, int position);

    protected void setupOnItemClick(final VH viewHolder, final int position) {
        if (mItemClickListener != null) {
            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mItemClickListener.onItemClick(null, viewHolder.itemView, position, position);
                }
            });
        }
    }

    @Override
    public int getItemCount() {
        return mDatas.size();
    }

    public T getItem(int position) {
        position = Math.max(0, position);
        return mDatas.get(position);
    }

    public List<T> getDataSource() {
        return mDatas;
    }

    public void addData(List<T> newItems) {
        if (newItems != null) {
            mDatas.addAll(newItems);
            notifyDataSetChanged();
        }
    }
    public void deleteItem(int position) {
        mDatas.remove(position);
        notifyItemRemoved(position);
        notifyDataSetChanged();
    }

    public void updateListViewData(List<T> lists) {
        mDatas.clear();
        if (lists != null) {
            mDatas.addAll(lists);
            notifyDataSetChanged();
        }
    }

    public void setOnItemClickListener(AdapterView.OnItemClickListener listener) {
        this.mItemClickListener = listener;
    }
}

上面的代碼中對數(shù)據(jù)的獲取,添加,刪除,替換等操作進(jìn)行了封裝。還有點(diǎn)擊事件,默認(rèn)的 RecyclerAdapter 是不管點(diǎn)擊事件的,需要我們自己去做接口。當(dāng)然了,也可以直接寫在 Adapter 里面,不過耦合性不是太好。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容