recyclerView:通用適配器

unsplash

背景:為了使項(xiàng)目更加整潔,利于開發(fā),后期管理,需要打造一款通用的recyclerview的適配器,功能要求:滿足不同數(shù)據(jù)內(nèi)容的適配;數(shù)據(jù)綁定部分簡潔易懂;點(diǎn)擊事件和長按事件監(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)擊和長按事件;

/**
 * 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也是通過鍵值對儲(chǔ)存,相比map集合有著占用內(nèi)存小的優(yōu)點(diǎn),用來替代Map<Integer,Objecty>;
通過傳入item中的viewId來獲取view:如果數(shù)組中沒有,則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;
        }
    }

多布局是通過自己來分配布局來實(shí)現(xiàn)的,定義接口并且在實(shí)例adapter的時(shí)候傳入實(shí)現(xiàn)對象,
自定義返回的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);
    }
}
最后編輯于
?著作權(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)容