優雅地刷新RecyclerView
前言
還是那句話,RecyclerView的viewType增多,邏輯變復雜,幾個月后,你確定還能理清思路嗎?假設我們服務端是多個接口返回數據,你確定能正確刷新相應type嗎?想一個RecyclerView高效快捷管理整個界面嗎?你還在使用notifyDataSetChanged無腦刷新嗎?你想單個viewType在loadingView,dataView,errorView自如切換嗎?如果你遲疑了,那你不妨試試本庫。
特點
- 與Adapter為組合關系,可配合大多數Adapter
- 一行代碼刷新相應viewType
- 支持非死book的shimmer加載效果
- 支持粘性頭
- 支持異步刷新,可擴展(如配合RxAndroid)
- 支持加載相應type錯誤頁面
- 支持高頻率刷新(流暢,異步執行)
效果
線性排布
方格排布
關鍵字高亮
刷新錯誤頁面
高頻率刷新
更新內容
- 支持刷新type錯誤頁面(可自定義)
- 支持同時刷新多個type(異步,高頻率)
- 鏈式注冊資源
- 支持刷新單個數據
- 提供helper的清除單個type,清除整個界面api
- 提供getHeaderId的默認實現抽象類
支持刷新type錯誤頁面(可自定義)
public void notifyMoudleErrorChanged(ErrorEntity errorData, int type);
public void notifyMoudleErrorChanged(int type);</code></pre>
一行代碼搞定,前者提供實體類是考慮有些用戶需要根據實體數據屬性去更新,因此錯誤頁面的layoutId是用戶提供的。
支持同時刷新多個type(異步,高頻率)
//刷新隊列,支持高頻率刷新
private Queue<HandleBase<T>> mRefreshQueue;
這里采用的是隊列的形式管理刷新,提供清空隊列的Api。
鏈式注冊資源
registerMoudle(@IntRange(from = 0, to = 999) int type)
.level(@IntRange(from = 0) int level)
.layoutResId(@LayoutRes int layoutResId)
.headerResId(@LayoutRes int headerResId)
.loading()
.loadingLayoutResId(@LayoutRes int loadingLayoutResId)
.loadingHeaderResId(@LayoutRes int loadingHeaderResId)
.error()
.errorLayoutResId(@LayoutRes int errorLayoutResId)
.register();
由于參數越來越多,這里采用了較為流行的鏈式注冊,內部通過ResourcesManager管理所有資源。
注:原來的注冊方式已設置為過時,請及時更新,不出2個版本將移除。
支持刷新單個數據
public void notifyMoudleDataAndHeaderChanged(T data, T header, int type)
可能某個type只有一個實體數據管理著整個type
public void notifyMoudleDataAndHeaderChanged(List<? extends T> data, T header, int type)
可傳T的子類集合
提供helper的清除單個type,清除整個界面api
/**
- 清除單個type數據
*
- @param type 數據類型
*/
public void clearMoudle(int type);
/**
- 清除所有數據
*/
public void clear();</code></pre>
提供getHeaderId的默認實現抽象類
假設你不實現粘性頭而強制要寫getHeaderId確實挺討厭的,由于現在android還不是很好地兼容java8,因此暫時提供DefaultMultiHeaderEntity。
使用注意點
type 取值范圍
- 數據類型 [0,1000)
- 頭類型 [-1000,0)
- shimmer數據類型 [-2000,-1000)
- shimmer頭類型 [-3000,-2000)
- error類型 [-4000,-3000)
常量差值
//頭類型差值
public static final int HEADER_TYPE_DIFFER = 1000;
//shimmer數據類型差值
public static final int SHIMMER_DATA_TYPE_DIFFER = 2000;
//shimmer頭類型差值
public static final int SHIMMER_HEADER_TYPE_DIFFER = 3000;
//錯誤類型差值
public static final int ERROR_TYPE_DIFFER = 4000;
結束
庫多多少少也更新幾個版本了,你的意見,你的建議,你的star,你的分享,一直是我前進的動力。還有一點要說的就是現在關于LayoutManager,RecyclerView,Adapter的流派很多,我們更關注于數據的優雅刷新。
如果對本庫還不是很了解的同學可以到我的github查看更多版本進行了解。
gradle依賴
compile 'com.crazysunj:multitypeadapter:1.3.0'
本文由用戶 RafaelBroad 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!