1.關于需求介紹
1.1 需求有這些
1.2 封裝理念
2.簡單封裝【V1.0版本】
2.1 封裝簡單的ViewHolder
2.2 封裝簡單RecyclerView.Adapter
2.3 如何使用通用adapter
2.4 如何使布局多樣化
做法
原理
a.定義一個接口,判斷傳回資料類型
b.修改封裝adapter中getItemViewType中代碼
c.修改adapter,實作自定義接口
d.在Activity中設定參數location【定義類型參數】
3.簡單封裝困境
3.1 遇到問題與困境
3.2 用之前封裝類實作多種類型布局,出現的弊端
4.關于複雜界面封裝
4.1 具體可以看YCRefreshView
<a href="http://www.jianshu.com/p/53017c3fc75d">部落格大彙總,持續更新目錄說明,記錄所有開源項目和部落格</a>
RecycleView可以滿足諸多功能,封裝公用的adapter,提高程式設計效率
資料的綁定,重新整理
多種不同類型的資料綁定
優雅添加頭布局或者底布局
增加onItemClickListener , onItenLongClickListener
支援加載相應type錯誤頁面,無資料頁面
支援集合set,add,remove,clear等操作重新整理
構造一個通用的Adapter模版,避免每添加一個清單就要寫一個Adapter,避免寫Adapter中的大量重複代碼
高内聚,低耦合,擴充友善
通過組裝的方式來建構Adapter,将每一種(ViewType不同的)Item抽象成一個單獨元件,Adapter 就是一個殼,我們隻需要向Adapter中添加Item就行,這樣做的好處就是減少耦合,去掉一種item 或者添加一種item對于清單是沒有任何影響的
首先,繼承 RecyclerView.ViewHolder 實作一個通用的 ViewHolder當中,使用 SparseArray 來存放 View 以減少 findViewById 的次數,SparseArray 比 HashMap 更省記憶體,在某些條件下性能會更好,不過隻能存儲 key 為 int 類型的資料,正好用來存放資源ID
因為清單項中一般都是使用 TextView,ImageView 等控件,是以這裡提供控件的操作方法。此外,為了監聽清單項單擊和輕按兩下事件,這裡再來自定義一個接口 onItemCommonClickListener ,用于點選事件回調
因為不知道要使用到的資料類型是哪一種,也為了更好的适配各種資料類型,是以這裡需要用到泛型當中,onBindViewHolder(CommonViewHolder holder, int position) 需要我們自己來操作,是以這裡再來聲明一個抽象方法 bindData(CommonViewHolder holder, T data) ,由子類來負責實作綁定操作
添加簡單的設定資料,清理資料,移除資料的方法
需要先來繼承 XXXAdapter ,隻需要實作一個方法即可,看起來簡潔多了吧。代碼中聲明了兩個構造函數,根據是否需要用到點選事件監聽來選擇
抽取的adapter已經可以為我們節省很多代碼了,免去了一些重複性操作。但是如果list清單有多種類型,比如像聊天界面,有聊天文字,圖檔,檔案,紅點等多種不同的布局。那麼添加使用不同布局的功能十分重要。
做法:
複寫getItemViewType,根據我們的bean去傳回不同的類型
onCreateViewHolder中根據itemView去生成不同的ViewHolder
定義一個接口,判斷傳回資料類型 需要有一個方法來判斷哪種資料類型需要使用哪種布局,是以再來定義一個接口,getLayoutId() 用于返會布局檔案ID
修改 XXXAdapter。如果 multiTypeSupport 不為 null,意思就是要使用到不同的布局檔案了,則調用 getLayoutId() 方法,将其傳回值作為 ItemViewType
修改Adapter 類,實作 MultiTypeSupport 接口,根據 T 對象的 location 字段的值,來決定傳回哪個布局檔案的ID
前面,我們可以簡單實作不同布局類型的。但是大多數的App首頁都是比較複雜的,比如一個社交APP的首頁,包含Banner區、廣告區、文本内容、圖檔内容、視訊内容等等。RecyclerView 可以用ViewType 來區分不同的item,也可以滿足需求 ,但還是存在一些問題。
0,如果type的部分實體類參數不同,如何傳遞setData。即使合并了實體類,但是維護起來十分困難。
1,在item過多邏輯複雜清單界面,Adapter裡面的代碼量龐大,邏輯複雜,後期難以維護
2,每次增加一個清單都需要增加一個Adapter,重複搬磚,效率低下。
0.傳遞進來的實體類隻能是一種,如果處理多種類型的參數不相同,那麼合并實體類容易出問題
1.下面這樣就是我們通常寫一個多Item清單的方法,根據不同的ViewType 處理不同的item,如果邏輯複雜,這個類的代碼量是很龐大的。如果版本疊代添加新的需求,修改代碼很麻煩,後期維護困難。
**自定義支援上拉加載更多,下拉重新整理,支援自由切換狀态【加載中,加載成功,加載失敗,沒網絡等狀态】的控件,拓展功能[支援長按拖拽,側滑删除]可以選擇性添加
。具體使用方法,可以直接參考demo。**
輕量級側滑删除菜單,支援recyclerView,listView,直接嵌套item布局即可使用,整個側滑菜單思路是:跟随手勢将item向左滑動
該庫已經用到了實際開發項目中,會持續更新并且修改bug。如果覺得可以,可以star一下,多謝支援!
感謝前輩大神們案例及開源分享精神。
一行代碼內建:compile 'org.yczbj:YCRefreshViewLib:2.4'