優雅地刷新RecyclerView

RafaelBroad 7年前發布 | 17K 次閱讀 Android開發 移動開發 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!