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

时间:2015-10-02 18:54:04

标签: android mvvm android-recyclerview android-volley networkimageview

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

我基本上尝试使用包含NetworkImageViews(使用Volley& ImageLoader)的一些项目(不是全部)显示一个Feed。

问题在于我的持有人是否被回收,而且我的当前" 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());
}

2 个答案:

答案 0 :(得分:0)

我发现使用 Fresco 代替Volley / ImageLoader可以解决问题。

答案 1 :(得分:0)

Glide取代了带有Android Volley的Imageloader,可以完美地加载网络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);