如何使用滑动预先加载图像?

时间:2018-03-07 09:32:33

标签: android android-recyclerview android-glide

实际上,我正在尝试使用reycycleview将图片加载到glide 4.4.0中,并且加载正常。但现在问题是我的recyclerview由于图像加载而快速滚动时有点滞后。但是我看到了一些名为preloaddownloadOnly的滑行方法。所以,我的问题是这些方法是否有助于提前加载图像,如果是这样,那么如何使用它们?

1 个答案:

答案 0 :(得分:2)

您可以使用this微调预加载。它需要相当多的工作,但看起来很有希望。

简而言之,您需要创建一个PreLoader类,它将从您的数据集中获取图像URL:

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);
    }
}

然后在回收站视图中将其设置为滚动侦听器:

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);

在此之后,您将在适配器中的onBondViewHolder回调之前预先加载图像,并且您将能够从缓存中显示它们。

@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);
}