Вместо того, чтобы делать что-то вроде этого:
.into(new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
imageView.setImageDrawable(resource);
progressBar.setVisibility(View.GONE);
}
});
Просто вставьте в into
функцию свой imageView
.Если вы все еще хотите получать уведомления при каждой загрузке, вы можете использовать функцию listener
.Ваш код должен выглядеть следующим образом:
Glide
.with(context)
.load(objects.get(position))
.apply(new
RequestOptions()
.fitCenter()
.error(R.drawable.logo)
.placeholder(R.drawable.logo)
.diskCacheStrategy(DiskCacheStrategy.ALL)
)
.listener(new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable
Transition<? super Drawable> transition) {
progressBar.setVisibility(View.GONE);
}
})
.into(imageView);
Glide должен обрабатывать жизненный цикл RecyclerView самостоятельно.Единственное, что вам нужно сделать, это спрятать индикатор выполнения.Вам не нужно устанавливать рисование в ImageView самостоятельно.
ОБНОВЛЕНИЕ: Упомянутый подход является лучшим, однако он дает мне lint
ошибки при использовании SimpleTarget<?>()
внутри .listener()
, возможно, из-за возможной разницы версий и заставил меня использовать RequestListener<Drawable>()
, и это работает:
Glide.with(holder.service_image.getContext()).load(imageArray.get(0)).apply(new RequestOptions().fitCenter().error(R.drawable.logo).placeholder(R.drawable.logo).diskCacheStrategy(DiskCacheStrategy.ALL)).listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
holder.progressBar.setVisibility(View.GONE);
return false;
}
}).into( holder.service_image);