RecyclerView Adapter封裝解析

前言

關(guān)于adapter的封裝煤禽,網(wǎng)上有很多開(kāi)源庫(kù)液样,開(kāi)發(fā)的時(shí)候可以直接拿來(lái)用振亮,省了很多事。
最近閑來(lái)無(wú)事鞭莽,想著自己動(dòng)手封裝一個(gè)adapter坊秸,主要參考了這篇文章:http://www.reibang.com/p/3e60147523e1 感謝

問(wèn)題

  1. 通常我們封裝的時(shí)候,可以簡(jiǎn)化到這一步:

     BaseRecyclerViewAdapter adapter = new BaseRecyclerViewAdapter() {
         private static final int TYPE_FIR = 1;
         private static final int TYPE_SEC = 2;
         private static final int TYPE_THR = 3;
    
         @Override
         public int getLayoutId(int viewType) {
             if (viewType == TYPE_FIR) {
                 return R.layout.test_activity_recyclerview_item;
             } else if (viewType == TYPE_SEC){
                 return R.layout.test_activity_recyclerview_item_two;
             } else {
                 return R.layout.test_activity_recyclerview_item_three;
             }
         }
    
         @Override
         public int getItemViewType(int position) {
             if (position % 3 == 1) {
                 return TYPE_FIR;
             } else if (position % 3 == 2) {
                 return TYPE_SEC;
             } else {
                 return TYPE_THR;
             }
         }
    
         @Override
         public void onBindRecyclerViewHolder(BaseViewHolder holder, int position) {
             if (getItemVIewType(position) == TYPE_FIR) {
                 // TODO 數(shù)據(jù)處理及綁定
             } else if (getItemVIewType(position) == TYPE_SEC) {
                 // TODO 數(shù)據(jù)處理及綁定
             } else {
                 // TODO 數(shù)據(jù)處理及綁定
             }
         }
     };
    
  2. 從上面代碼我們可以看到澎怒,當(dāng)處理多布局類(lèi)型的時(shí)候褒搔,我們需要解決的是:

    1. 多布局類(lèi)型定義
    2. 返回什么類(lèi)型處理
    3. 根據(jù)指定類(lèi)型,加載對(duì)應(yīng)布局Layout
    4. 根據(jù)類(lèi)型喷面,處理及綁定數(shù)據(jù)
  3. 當(dāng)我們迭代更新的時(shí)候星瘾,我們只能通過(guò)修改adapter,這樣耦合性稍微有點(diǎn)強(qiáng)乖酬。
    不過(guò)呢死相,簡(jiǎn)化到這一步的時(shí)候,其實(shí)在項(xiàng)目中是可以使用的

解決

  1. 上面的問(wèn)題咬像,我們知道算撮,如果需要迭代更新,我們只能通過(guò)修改viewType县昂、layout肮柜、onBind等具體數(shù)據(jù)來(lái)實(shí)現(xiàn)。既然這樣倒彰,我們可以將這些具體數(shù)據(jù)抽取封裝起來(lái)审洞,adapter不直接處理數(shù)據(jù),而是交給這個(gè)封裝類(lèi),邏輯交給封裝類(lèi)來(lái)處理芒澜,這樣adapter只需要負(fù)責(zé)維護(hù)這個(gè)封裝類(lèi)即可仰剿。

  2. 這個(gè)封裝類(lèi),我們暫且稱(chēng)作Item

     interface Item {
         @LayoutRes
         int getLayoutResource();
         int getItemViewType();
         BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType);
         void onBindViewHolder(BaseViewHolder holder, int position);
     }
    

    adpater中痴晦,需要?jiǎng)討B(tài)調(diào)整的就是

    1. viewType
    2. layout布局
    3. onCreateViewHolder
    4. onBindViewHolder
      所以就將這些方法抽取封裝起來(lái)南吮,然后adapter維護(hù)Item列表即可
  3. 上面這個(gè)接口Item
    第一:沒(méi)有數(shù)據(jù),我們需要自己在實(shí)現(xiàn)類(lèi)中提供數(shù)據(jù)設(shè)置獲取方法誊酌;
    第二:我們需要同時(shí)實(shí)現(xiàn)四個(gè)方法
    既然這樣部凑,我們可以通過(guò)一個(gè)基類(lèi)BaseItem,來(lái)簡(jiǎn)化操作

  4. 在Item接口中碧浊,只有onCreateViewHolder()方法涂邀,是不需要每次都實(shí)現(xiàn)的,因?yàn)樗枪潭ú蛔兊牡南淙瘢珺aseItem就可以這樣寫(xiě):

     public abstract class BaseItem<T> implements Item {
         public T mData;     
     
         public void setData(T t) {
             this.mData = t;
         }
             
         @Override
         public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
             int resourceId = getLayoutResource();            
             View itemView = LayoutInflater.from(parent.getContext()).inflate(resourceId, parent, false);             
             return new BaseViewHolder(itemView);
         }
     }
    
  5. 現(xiàn)在比勉,我們只需要實(shí)現(xiàn)三個(gè)方法就可以了。我們?cè)倏磄etItemViewType瑞躺,這個(gè)返回的是當(dāng)前布局類(lèi)型敷搪,int類(lèi)型,唯一且不能重復(fù) 幢哨。Android中的Layout維護(hù)著一個(gè)int型的唯一標(biāo)識(shí)ID赡勘,我們是不是可以拿這個(gè)標(biāo)識(shí)ID,作為viewType捞镰?這樣就可以進(jìn)一步簡(jiǎn)化實(shí)現(xiàn)類(lèi)闸与,現(xiàn)在我們只需實(shí)現(xiàn)兩個(gè)方法即可。

     public abstract class BaseItem<T> implements Item {
         public T mData;
         public void setData(T t) {
             this.mData = t;
         }
     
         @Override
         public int getItemViewType() {
             return getLayoutResource();
         }
     
         @Override
         public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
             int resourceId = getLayoutResource();   
             View itemView = LayoutInflater.from(parent.getContext()).inflate(resourceId, parent, false);      
             return new BaseViewHolder(itemView);
         }
     }
    
  6. 接下來(lái)岸售,我們要構(gòu)造Adapter践樱,使之不再維護(hù)具體數(shù)據(jù),而是BaseItem列表

     public class BaseAdapter extends RecyclerView.Adapter<BaseViewHolder>   {
         private List<BaseItem> mData;
     
         public BaseRecyclerViewAdapter(List<BaseItem> data) {
             mData = new ArrayList<>();
             if (data != null) {
                 mData.addAll(data);
             }
         }
     
         @Override
         public BaseViewHolder onCreateViewHolder(ViewGroup parent, final int viewType) {
             for (BaseItem item : mData) {
                 if (viewType == item.getItemViewType()) {             
                     return item.onCreateViewHolder(parent, viewType);;
                 }
             }
         }
     
         @Override
         public void onBindViewHolder(BaseViewHolder holder, int position) {
             mData.get(dataPosition).onBindViewHolder(holder, position);
         }
     
         @Override
         public int getItemCount() {
             return mData.size();
         }
     
         @Override
         public int getItemViewType(int position) {
             return mData.get(position).getItemViewType();
         }
     }
    

結(jié)語(yǔ)

以上簡(jiǎn)單介紹了一下封裝思路凸丸,至于像頭布局拷邢、腳布局、空布局屎慢、加載更多布局等等瞭稼,其實(shí)都是Adapter中的一種vietType布局,具體實(shí)現(xiàn)代碼腻惠,還請(qǐng)有勞移駕到GitHub:BaseAdapter查看环肘。歡迎star,提意見(jiàn)集灌。

下圖是一adapter中數(shù)據(jù)構(gòu)造:

圖1.png

參考資料

http://www.reibang.com/p/3e60147523e1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悔雹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腌零,老刑警劉巖梯找,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異益涧,居然都是意外死亡初肉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)饰躲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人臼隔,你說(shuō)我怎么就攤上這事嘹裂。” “怎么了摔握?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵寄狼,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我氨淌,道長(zhǎng)泊愧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任盛正,我火速辦了婚禮删咱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘豪筝。我一直安慰自己痰滋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布续崖。 她就那樣靜靜地躺著敲街,像睡著了一般。 火紅的嫁衣襯著肌膚如雪严望。 梳的紋絲不亂的頭發(fā)上多艇,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音像吻,去河邊找鬼峻黍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛萧豆,可吹牛的內(nèi)容都是我干的奸披。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼涮雷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼阵面!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤样刷,失蹤者是張志新(化名)和其女友劉穎仑扑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體置鼻,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镇饮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了箕母。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片储藐。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嘶是,靈堂內(nèi)的尸體忽然破棺而出钙勃,到底是詐尸還是另有隱情,我是刑警寧澤聂喇,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布辖源,位于F島的核電站,受9級(jí)特大地震影響希太,放射性物質(zhì)發(fā)生泄漏克饶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一誊辉、第九天 我趴在偏房一處隱蔽的房頂上張望矾湃。 院中可真熱鬧,春花似錦堕澄、人聲如沸洲尊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)坞嘀。三九已至,卻和暖如春惊来,著一層夾襖步出監(jiān)牢的瞬間丽涩,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工裁蚁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留矢渊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓枉证,卻偏偏與公主長(zhǎng)得像矮男,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子室谚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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