更多关于安卓源码分析文章,请看:Android源码分析专栏
鼎鼎大名的安卓图片加载框架Glide有一个可能大家比较少用的功能,就是RecyclerView滑动的预加载组件RecyclerViewPreloader
,它的功能就是在滑动列表的时候提前加载指定item图片数据进入内存,使得滑动的时候可以立即看到图片显示而不需要等待。
如何使用:
它的使用非常简单,使用过RecyclerView的人看一下以下代码就能明白了:
vRecycler = findViewById(R.id.v_recycler);
requestManager = Glide.with(this);
//创建一个ViewPreloadSizeProvider,它是用于记录列表item显示图片的View的尺寸的
ViewPreloadSizeProvider<String> preloadSizeProvider = new ViewPreloadSizeProvider<>();
final ListAdapter adapter = new ListAdapter(this, urlList, preloadSizeProvider);
/**
* MyPreloadModelProvider是自己写的实现ListPreloader.PreloadModelProvider接口的类,作用是
* 1.返回需要提前加载的图片url
* 2.返回一个加载图片的RequestBuilder(Glide内部的加载构建器)
*/
MyPreloadModelProvider preloadModelProvider = new MyPreloadModelProvider();
//将ViewPreloadSizeProvider和MyPreloadModelProvider对象以及设定的提前加载item个数作为参数创建一个RecyclerViewPreloader
RecyclerViewPreloader<String> preloader = new RecyclerViewPreloader<>(this, preloadModelProvider
, preloadSizeProvider, 10);
vRecycler.setLayoutManager(new LinearLayoutManager(this));
//将创建的RecyclerViewPreloader对象设置为RecyclerView的滚动监听器
vRecycler.addOnScrollListener(preloader);
vRecycler.setAdapter(adapter);
vRecycler.setItemViewCacheSize(0);
vRecycler.setRecyclerListener(new RecyclerView.RecyclerListener() {
@Override
public void onViewRecycled(RecyclerView.ViewHolder holder) {
ListAdapter.MyViewHolder myViewHolder = (ListAdapter.MyViewHolder) holder;
requestManager.clear(myViewHolder.img);
}
});
}
private class MyPreloadModelProvider implements ListPreloader.PreloadModelProvider<String> {
@NonNull
@Override
public List getPreloadItems(int position) {
Log.e("PreloadRequestBuilder ", "position" + position);
//告诉RecyclerViewPreloader每个item项需要加载的图片url集合
return urlList.subList(position, position + 1);
}
@Nullable
@Override
public RequestBuilder<?> getPreloadRequestBuilder(@NonNull String url) {
Log.e("PreloadRequestBuilder ", "url" + url);
//返回一个加载图片的RequestBuilder(Glide内部的加载构建器)
return requestManager.load(url);
}
}
好的,这样子只要滑动起来就可以实现列表图片的预加载了。
源码解析:
那它的实现原理是怎样的呢?
首先,既然RecyclerViewPreloader可以给RecyclerView设置为滚动监听器,所以它是实现了RecyclerView.OnScrollListener。(不容置疑,看了源码确实也是如此~)
从上面的demo的构造方法点进去看:
/**
* Helper constructor that accepts an {@link Activity}.
*/
public RecyclerViewPreloader(@NonNull Activity