NetworkImageView в RecyclerView вызывает проблемы с отображением из-за повторного использования

Итак, я использую MVVM, привязку данных, RecyclerView и Volley ImageLoader с NetworkImageView.

И я в основном пытаюсь отобразить канал с некоторыми элементами (не со всеми), содержащими NetworkImageViews (используя Volley и ImageLoader).

Проблема в том, что мой держатель переработан, и мой «текущий» NetworkImageView отображает ранее запрошенный imageUrl (запросил другую карту).

Я провел небольшое исследование и должен отменить запрос, если мой держатель будет переработан. Я понимаю, я действительно не понимаю, как это сделать в моем текущем коде и сделать это ЧИСТЫМ.

PS: Я не хочу избегать повторного использования моего RecyclerView (тогда нет смысла его использовать).

Я действительно удивлен, что ImageLoader/ImageContainer не может правильно обрабатывать это по умолчанию. Если есть простой, работающий и легко поддерживаемый способ сделать это с другой библиотекой (Fresco, Picasso, Glide, UIL,...), то почему бы и нет.

Вот мой адаптер:

public final class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.BindingHolder> {

    private Context context;
    private List<FeedEntry> feedEntries;

    public FeedAdapter(Context _context, List<FeedEntry> _feedEntries) {
        this.context = _context;
        this.feedEntries = _feedEntries;
    }

    @Override
    public BindingHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        if (viewType == FeedEntry.TYPE_IMAGE_ID) {
            ItemFeedEntryImageBinding itemFeedEntryImageBinding = DataBindingUtil.inflate(
                    LayoutInflater.from(parent.getContext()),
                    R.layout.item_feed_entry_image,
                    parent,
                    false);
            return new BindingHolder(itemFeedEntryImageBinding);
        }
    }

    @Override
    public void onBindViewHolder(BindingHolder holder, int position) {

        if (getItemViewType(position) == FeedEntry.TYPE_IMAGE_ID) {
            ItemFeedEntryImageBinding feedEntryImageBinding = (ItemFeedEntryImageBinding) holder.binding;
            feedEntryImageBinding.setViewModel(new FeedEntryViewModel(this.context, this.feedEntries.get(position)));
        }
    }


    @Override
    public int getItemCount() {
        return this.feedEntries.size();
    }

    @Override
    public int getItemViewType(int position) {
        // Code...
        return FeedEntry.TYPE_IMAGE_ID;
    }

    public static class BindingHolder extends RecyclerView.ViewHolder {
        private ViewDataBinding binding;

        public BindingHolder(ItemFeedEntryImageBinding binding) {
            super(binding.feedEntryCard);
            this.binding = binding;
        }
    }
}

И есть основное содержимое моей ViewModel

@BindingAdapter({"bind:contentImageUrlVolley"})
public static void loadContentImageVolley(NetworkImageView view, String url) {
    //view.setImageUrl(null, MyApplication.getInstance().getImageLoader()); Do not solve my issue
    view.setImageUrl(url, MyApplication.getInstance().getImageLoader());
}

person shemsu    schedule 02.10.2015    source источник
comment
Похожий вопрос   -  person kaay    schedule 06.05.2016


Ответы (2)


Я обнаружил, что использование Fresco вместо Volley/ImageLoader решает проблему.

person shemsu    schedule 05.10.2015

Вместо Imageloader с Android volley, Glide отлично работает при загрузке сетевых URL-изображений. Ниже я добавил фрагмент. Удачного кодирования!

RequestOptions requestOptions = new RequestOptions();
    requestOptions.placeholder(R.drawable.noimage);
    requestOptions.error(R.drawable.noimage);

    Glide.with(context)
            .setDefaultRequestOptions(requestOptions)
            .load(eventPojo.getURL()).into(holder.imgThumbnail);
person sudharsan chandrasekaran    schedule 19.03.2019