Glide列表预加载组件RecyclerViewPreloader源码解析

更多关于安卓源码分析文章,请看:Android源码分析专栏

 

鼎鼎大名的安卓图片加载框架Glide有一个可能大家比较少用的功能,就是RecyclerView滑动的预加载组件RecyclerViewPreloader ,它的功能就是在滑动列表的时候提前加载指定item图片数据进入内存,使得滑动的时候可以立即看到图片显示而不需要等待。

Glide官方链接

 

如何使用:

它的使用非常简单,使用过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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值