RecyclerView 中的 NetworkImageView 因回收而导致显示问题

NetworkImageView in RecyclerView cause displaying issues due to recycling

因此,我将 MVVM、数据绑定、RecyclerView 和 Volley ImageLoader 与 NetworkImageView 一起使用。

我主要是尝试显示包含 NetworkImageViews(使用 Volley 和 ImageLoader)的一些项目(不是全部)的提要。

问题是我的 holder 被回收了,我的 "current" NetworkImageView 显示的是之前请求的 imageUrl(请求另一张卡)。

我做了一些研究,如果我的支架被回收,我必须取消请求。我明白了,我真的不知道如何在我当前的代码中执行此操作 CLEAN.

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

我发现使用 Fresco 而不是 Volley/ImageLoader 可以解决问题。

与使用 android 截击的 Imageloader 不同,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);