因此,我使用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());
}
答案 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);