そのため、MVVM、Data Binding、RecyclerView、および Volley ImageLoader を NetworkImageView と共に使用します。
そして、私は基本的に NetworkImageViews (Volley & ImageLoader を使用) を含むいくつかの項目 (すべてではない) を含むフィードを表示しようとしています。
問題は、ホルダーがリサイクルされ、「現在の」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());
}