DataPreloader用于实现列表数据预加载需求。注意这里的预加载是指预加载数据项的详细信息(例如预拉取视频列表里面某些视频的播放地址等),不是指预先拉取更多的列表项。概念说明
- 加载窗口preload window:即需要发起预加载的项目的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/