Неправильное изображение загружается в RecyclerView при использовании библиотеки загрузки изображений Fresco.

Я использую RecyclerView, и в каждой позиции я предоставляю другую ссылку на изображение в SimpleDraweeView row_layout recyclerview. Проблема в том, что некоторое время он загружает изображение правильно. Но в некоторых случаях загружается одно и то же изображение в количестве строк, хотя для каждой строки я предоставляю другую ссылку на изображение.

Я не понимаю, в чем проблема, может быть, это проблема с кэшированием, пожалуйста, предложите мне решение, как решить. Вот как я использую библиотеку Fresco.

 Uri uri = Uri.parse(urlImage);
    ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
            .setProgressiveRenderingEnabled(true)
            .build();

    DraweeController draweeController = Fresco.newDraweeControllerBuilder()
            .setUri(uri)
            .setImageRequest(request)
            .setOldController(holder.productImage.getController())
            .build();
    holder.productImage.setController(draweeController);

Это коды адаптера recyclerview

public class AdapterProductRow extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

LayoutInflater inflater;
Context context;
List<DesignProductRow> list = Collections.emptyList();
Map<String, String> params = new HashMap<String, String>();

private VolleySingleton volleySingleton;
private RequestQueue requestQueue;

private boolean isFooterEnabled = true;
private final int VIEW_TYPE_ITEM = 1;
private final int VIEW_TYPE_PROGRESSBAR = 0;
int previousPosition = 0;
int initSize = 0;
int numberLike = 0;
boolean userAlreadyLiked = false;

public AdapterProductRow(Context context) {
    inflater = LayoutInflater.from(context);
    this.context = context;
    volleySingleton = VolleySingleton.getsInstance();
    requestQueue = volleySingleton.getRequestQueue();

}

public void setProductList(List<DesignProductRow> list) {
    this.list = list;
    notifyItemRangeChanged(initSize, list.size());
    initSize = list.size();
}



@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    if (viewType == VIEW_TYPE_ITEM) {

        View view = inflater.inflate(R.layout.custom_row_products, parent, false);
        RecyclerView.ViewHolder vh = new ViewHolderProductRow(view);
        return vh;

    } else {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.progress_bar_recyclerview, parent, false);

        RecyclerView.ViewHolder vh = new ProgressViewHolder(v);
        return vh;

    }

}

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {

    if (holder instanceof ProgressViewHolder) {
        ((ProgressViewHolder) holder).progressBar.getIndeterminateDrawable().setColorFilter(
                context.getResources().getColor(R.color.colorPrimary),
                android.graphics.PorterDuff.Mode.SRC_IN);
        ((ProgressViewHolder) holder).progressBar.setIndeterminate(true);

    } else if (list.size() > 0 && position < list.size()) {

        final DesignProductRow design = list.get(position);
        ((ViewHolderProductRow) holder).productName.setText(design.getProductName());

        if (design.getProductPrice().equalsIgnoreCase("0")) {
            ((ViewHolderProductRow) holder).productPrice.setText("Rs. NA");
        } else {
            ((ViewHolderProductRow) holder).productPrice.setText("Rs. " + design.getProductPrice());
        }

        if (design.getProductLiked().equals("1") == true) {
            ((ViewHolderProductRow) holder).productLike.setButtonDrawable(R.drawable.ic_love_dark_red);
            // ((ViewHolderProductRow) holder).productLike.setChecked(true);
            userAlreadyLiked = true;
        } else {
            ((ViewHolderProductRow) holder).productLike.setButtonDrawable(R.drawable.ic_love_holo_blank);
            //((ViewHolderProductRow) holder).productLike.setChecked(false);
            userAlreadyLiked = false;
        }

        //Load product Image
        loadFrancoImage(design.getProductImage(), ((ViewHolderProductRow) holder));

        if (design.getProductLikeCount().equalsIgnoreCase("0") == true) {
            numberLike = Integer.parseInt(design.getProductLikeCount());
            ((ViewHolderProductRow) holder).layoutLike.setVisibility(View.INVISIBLE);
        } else {
            numberLike = Integer.parseInt(design.getProductLikeCount());
            ((ViewHolderProductRow) holder).layoutLike.setVisibility(View.VISIBLE);
            ((ViewHolderProductRow) holder).productLikeCount.setText(design.getProductLikeCount());
        }


        if (position > previousPosition) {
            AnimationUtils.animateProduct(((ViewHolderProductRow) holder), true);
        } else {
            AnimationUtils.animateProduct(((ViewHolderProductRow) holder), false);
        }
        previousPosition = position;

        ((ViewHolderProductRow) holder).productLike.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {


                SharedPreferences loginData = PreferenceManager.getDefaultSharedPreferences(context);
                String USER_ID = loginData.getString("user_id", "");

                if (isChecked == true && userAlreadyLiked == false) {
                    // perform logic

                    ((ViewHolderProductRow) holder).productLike.setButtonDrawable(R.drawable.ic_love_dark_red);
                    if (((ViewHolderProductRow) holder).layoutLike.getVisibility() == View.INVISIBLE) {
                        ((ViewHolderProductRow) holder).layoutLike.setVisibility(View.VISIBLE);
                    }

                    numberLike = numberLike + 1;
                    ((ViewHolderProductRow) holder).productLikeCount.setText(String.valueOf(numberLike));
                    //Toast.makeText(context,"Checked",Toast.LENGTH_SHORT).show();
                    userAlreadyLiked = true;

                    callServerToSetLike(design.getProductId(), USER_ID, "1");

                } else if (isChecked == false && userAlreadyLiked == true) {
                    //Toast.makeText(context,"Unchecked",Toast.LENGTH_SHORT).show();
                    ((ViewHolderProductRow) holder).productLike.setButtonDrawable(R.drawable.ic_love_holo_blank);
                    numberLike = numberLike - 1;
                    userAlreadyLiked = false;
                    if (numberLike == 0) {
                        ((ViewHolderProductRow) holder).layoutLike.setVisibility(View.INVISIBLE);
                    } else {
                        ((ViewHolderProductRow) holder).layoutLike.setVisibility(View.VISIBLE);
                        ((ViewHolderProductRow) holder).productLikeCount.setText(String.valueOf(numberLike));
                    }

                    callServerToSetLike(design.getProductId(), USER_ID, "0");
                }

            }
        });

       /* ((ViewHolderProductRow) holder).productImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openProductDetailIntent(position);
            }
        });

        ((ViewHolderProductRow) holder).bottomLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openProductDetailIntent(position);
            }
        });
        */


    }

}


public void loadFrancoImage(String urlImage, final ViewHolderProductRow holder) {

    Uri uri = Uri.parse(urlImage);
    ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
            .setProgressiveRenderingEnabled(true)
            .build();

    DraweeController draweeController = Fresco.newDraweeControllerBuilder()
            .setUri(uri)
            .setImageRequest(request)
            .setOldController(holder.productImage.getController())
            .build();
    holder.productImage.setController(draweeController);

}

@Override
public int getItemViewType(int position) {
    return (isFooterEnabled && position >= list.size()) ? VIEW_TYPE_PROGRESSBAR : VIEW_TYPE_ITEM;

}

public void enableFooter(boolean isEnabled) {
    this.isFooterEnabled = isEnabled;
}

@Override
public int getItemCount() {
    return (isFooterEnabled) ? list.size() + 1 : list.size();
}

class ViewHolderProductRow extends RecyclerView.ViewHolder {
    private SimpleDraweeView productImage;
    private TextView productPrice;
    private TextView productName;
    private CheckBox productLike;
    private TextView productLikeCount;
    private RelativeLayout bottomLayout;
    private RelativeLayout layoutLike;


    public ViewHolderProductRow(View itemView) {
        super(itemView);

        productImage = (SimpleDraweeView) itemView.findViewById(R.id.productImage);
        productPrice = (TextView) itemView.findViewById(R.id.productPrice);
        productName = (TextView) itemView.findViewById(R.id.productName);
        productLike = (CheckBox) itemView.findViewById(R.id.ProductLiked);
        productLikeCount = (TextView) itemView.findViewById(R.id.productLikedNumber);
        bottomLayout = (RelativeLayout) itemView.findViewById(R.id.bottomLayout);
        layoutLike = (RelativeLayout) itemView.findViewById(R.id.layoutLike);


    }


}

static class ProgressViewHolder extends RecyclerView.ViewHolder {
    public ProgressBar progressBar;

    public ProgressViewHolder(View v) {
        super(v);
        progressBar = (ProgressBar) v.findViewById(R.id.progressBar);
    }

}

public void callServerToSetLike(final String productId, final String UserId, final String checked) {

    StringRequest request = new StringRequest(Request.Method.POST,
            URL_PRODUCT_LIKE,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {

                    //Get the server Response
                    // Toast.makeText(context,response.toString(),Toast.LENGTH_SHORT).show();
                }
            }
            , new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            params.put("user_id", UserId);
            params.put("product_id", productId);
            params.put("liked", checked);
            return params;
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> pars = new HashMap<String, String>();
            pars.put("Content-Type", "application/x-www-form-urlencoded");
            return pars;
        }
    };

    requestQueue.add(request);


}
}

person Rahul    schedule 20.08.2015    source источник
comment
Нам нужно больше деталей, чем это. Как настроен ваш RecyclerView.Adapter?   -  person tyronen    schedule 25.08.2015
comment
@tyronen - Извините за запоздалую реакцию, я добавил код адаптера представления ресайклера, пожалуйста, проверьте, предложите мне какой-нибудь способ управления кешем библиотеки fresco.   -  person Rahul    schedule 29.08.2015
comment
Маловероятно, что это проблема с кешем, если только один и тот же uri не может отображать разные изображения. Описанное вами поведение больше соответствует отображению неправильного представления. Я заметил, что вы не вызываете ни один из методов уведомления из enableFooter — возможно, вам следует?   -  person tyronen    schedule 23.09.2015
comment
Взгляните на это: stackoverflow.com/questions/34711792/   -  person plamenko    schedule 27.01.2016