首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NetworkImageView in RecyclerView导致显示回收问题

NetworkImageView in RecyclerView导致显示回收问题
EN

Stack Overflow用户
提问于 2015-10-02 18:54:04
回答 2查看 835关注 0票数 3

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

我基本上试图显示一个提要,其中包含一些包含NetworkImageViews的条目(不是全部)(使用Volley & ImageLoader)。

问题是我的持卡人是回收的,而我的“当前”NetworkImageView正在显示一个先前要求的imageUrl (要求另一张卡)。

我做了一些研究,如果我的保持架被回收,我不得不取消申请。我明白了,我不太明白如何在我当前的代码中这样做,并执行干净的

PS:,我不想避免我的RecyclerView的回收(那么使用它是没有意义的)。

我感到非常惊讶的是,在默认情况下,ImageLoader/ImageContainer无法正确地处理这个问题。如果有一种简单的、工作的、易于维护的方法来使用另一个库(弗雷斯科、毕加索、幻灯片、UIL、.),为什么不呢?

这是我的适配器:

代码语言:javascript
复制
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的主要内容

代码语言:javascript
复制
@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());
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-05 12:03:28

我发现使用Fresco而不是Volley/ImageLoader解决了这个问题。

票数 0
EN

Stack Overflow用户

发布于 2019-03-19 06:56:41

与android相比,Imageloader更适合加载网络URL图像。下面我添加了片段。编码愉快!

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32913987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档