Search code examples
androidandroid-recyclerviewandroid-glide

How to load image using glide in advance?


Actually I'm trying to load images into my reycycleview using glide 4.4.0 and it's loading fine . But now the problem is my recyclerview is lagging a bit when I scroll fast due to the image loading . But I saw some of the glide's method called preload and downloadOnly .So,my question is are these methods helpful for loading image in advance if so then how to use them?


Solution

  • You can use this to fine-tune your preloading. It requires quite a bit of work but looks promising.

    In short, you need to create a PreLoader class that will get image URLs from your data set:

    private class MyPreloadModelProvider implements PreloadModelProvider {
        @Override
        @NonNull
        public List<U> getPreloadItems(int position) {
          String url = myUrls.get(position);
          if (TextUtils.isEmpty(url)) {
            return Collections.emptyList();
          }
          return Collections.singletonList(url);
        }
    
        @Override
        @Nullable
        public RequestBuilder getPreloadRequestBuilder(String url) {
            return 
                GlideApp.with(fragment)
                  .load(url) 
                  .override(imageWidthPixels, imageHeightPixels);
        }
    }
    

    And then you set it as a scroll listener on your recycler view:

    PreloadSizeProvider sizeProvider = 
        new FixedPreloadSizeProvider(imageWidthPixels, imageHeightPixels);
    PreloadModelProvider modelProvider = new MyPreloadModelProvider();
    RecyclerViewPreloader<Photo> preloader = 
        new RecyclerViewPreloader<>(
            Glide.with(this), modelProvider, sizeProvider, 10 /*maxPreload*/);
    
    RecyclerView myRecyclerView = (RecyclerView) result.findViewById(R.id.recycler_view);
    myRecyclerView.addOnScrollListener(preloader);
    

    After this, you'll get your images preloaded before the onBondViewHolder callback in the adapter, and you'll be able to display them from the cache.

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {
      ImageView imageView = ((MyViewHolder) viewHolder).imageView;
      String currentUrl = myUrls.get(position);
    
      GlideApp.with(fragment)
        .load(currentUrl)
        .override(imageWidthPixels, imageHeightPixels)
        .into(imageView);
    }