recyclerView:通用適配器

unsplash

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

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

多布局是通過(guò)自己來(lái)分配布局來(lái)實(shí)現(xiàn)的呜呐,定義接口并且在實(shí)例adapter的時(shí)候傳入實(shí)現(xiàn)對(duì)象,
自定義返回的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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市坠宴,隨后出現(xiàn)的幾起案子洋魂,更是在濱河造成了極大的恐慌,老刑警劉巖喜鼓,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件副砍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡庄岖,警方通過(guò)查閱死者的電腦和手機(jī)豁翎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)隅忿,“玉大人心剥,你說(shuō)我怎么就攤上這事”惩” “怎么了优烧?”我有些...
    開(kāi)封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)链峭。 經(jīng)常有香客問(wèn)我畦娄,道長(zhǎng),這世上最難降的妖魔是什么熏版? 我笑而不...
    開(kāi)封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任纷责,我火速辦了婚禮,結(jié)果婚禮上撼短,老公的妹妹穿的比我還像新娘再膳。我一直安慰自己,他們只是感情好曲横,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布喂柒。 她就那樣靜靜地躺著不瓶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪灾杰。 梳的紋絲不亂的頭發(fā)上蚊丐,一...
    開(kāi)封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音艳吠,去河邊找鬼麦备。 笑死,一個(gè)胖子當(dāng)著我的面吹牛昭娩,可吹牛的內(nèi)容都是我干的凛篙。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼栏渺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼呛梆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起磕诊,我...
    開(kāi)封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤填物,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后霎终,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體滞磺,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年神僵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雁刷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡保礼,死狀恐怖沛励,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炮障,我是刑警寧澤目派,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站胁赢,受9級(jí)特大地震影響企蹭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜智末,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一谅摄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧系馆,春花似錦送漠、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)代兵。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背企垦。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留思币,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓羡微,卻偏偏與公主長(zhǎng)得像支救,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拷淘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容