1. 程式人生 > >[Android] 列表預載入工具類DataPreloader

[Android] 列表預載入工具類DataPreloader

DataPreloader用於實現列表資料預載入需求。注意這裡的預載入是指預載入資料項的詳細資訊(例如預拉取視訊列表裡面某些視訊的播放地址等),不是指預先拉取更多的列表項。

概念說明

  • 載入視窗preload window:即需要發起預載入的專案的index區間
  • 焦點:即當前外圍邏輯所關心的中心點的index,決定了區間的中心
該工具類引入載入視窗的概念(由upperPosition和LowerPosition組成的閉區間),外圍呼叫triggerPreload()傳入當前焦點的index,該工具類即回撥哪些index離開了載入視窗和哪些index進入了載入視窗(即視窗的變化情況)。外圍可以根據回撥來進行載入或取消載入。

使用說明

詳見程式碼和註釋如下所示:
mPreloader = new DataPreloader();
mPreloader.setDataSource(new DataPreloader.DataSource() {
    @Override
    public int getPreloadWindow(int direction) {
        // 返回視窗的上下界,每次更新視窗都會回撥一次,可以根據業務邏輯調整具體值
        if (direction == DataPreloader.PRELOAD_RANGE_LOWER_BOUND) {
            return 2;
        } else if (direction == DataPreloader.PRELOAD_RANGE_UPPER_BOUND){
            return 2;
        } else {
            return -1;
        }
    }
    @Override
    public int getItemCount() {
        return 10;
    }
});
mPreloader.setWindowListener(new DataPreloader.WindowListener() {
    @Override
    public void onEnterPreloadWindow(int position) {
        // position位置的專案進入了preload window,已經進入了的不會再回調
        Log.d(TAG, "onEnterPreloadWindow() called with: position = [" + position + "] " + mPreloader.getFocusPointPosition());
    }
    @Override
    public void onExitPreloadWindow(int position) {
        // position位置的專案離開了preload window,已經離開了的不會再回調
        Log.d(TAG, "onExitPreloadWindow() called with: position = [" + position + "]" + mPreloader.getFocusPointPosition());
    }
});

// 在適當的時候(例如列表滑動停止的時候),出發preloader更新視窗位置
mPreloader.triggerPreload(position);
注意: 合理設定區間的upper和lower。例如用於列表預載入時,可只設置upperBound,而lowerBound設定為0,那麼該工具類只會回撥後面的資料,不會回撥前面的資料 原始碼:https://gist.github.com/legendmohe/651cd418054a53f64bdd105f67265f15

檢視原文:http://legendmohe.net/2018/03/29/android-%e5%88%97%e8%a1%a8%e9%a2%84%e5%8a%a0%e8%bd%bd%e5%b7%a5%e5%85%b7%e7%b1%bbdatapreloader/