[Android] 列表預載入工具類DataPreloader
阿新 • • 發佈:2019-01-02
DataPreloader用於實現列表資料預載入需求。注意這裡的預載入是指預載入資料項的詳細資訊(例如預拉取視訊列表裡面某些視訊的播放地址等),不是指預先拉取更多的列表項。
概念說明
- 載入視窗preload window:即需要發起預載入的專案的index區間
- 焦點:即當前外圍邏輯所關心的中心點的index,決定了區間的中心
使用說明
注意: 合理設定區間的upper和lower。例如用於列表預載入時,可只設置upperBound,而lowerBound設定為0,那麼該工具類只會回撥後面的資料,不會回撥前面的資料 原始碼:https://gist.github.com/legendmohe/651cd418054a53f64bdd105f67265f15mPreloader = 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);
檢視原文: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/