Recyclerview адаптер и Glide - же изображение каждые 4-5 рядов

у меня эта проблема - только для целей тестирования я добавил ParseFile в одном из ParseObject из полученного списка. Вместо того, чтобы показывать его только в этой строке он показывает каждые 4-5 строк, иногда больше, иногда меньше. Я supspect, что вид утилизации надо что-то делать с этим. Как ни странно, другие данные (удаленные из этого примера) отлично работают с position переменной.

@Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        if(parseList.get(position).get("logo") != null){
            ParseFile image = (ParseFile) parseList.get(position).get("logo");
            String url = image.getUrl();
            Glide.with(context)
                    .load(url)
                    .placeholder(R.drawable.piwo_48)
                    .transform(new CircleTransform(context))
                    .into(holder.imageView);


        }

    }

5 ответов


ответы здесь неверны, хотя они находятся на правильном пути.

нужно позвонить Glide#clear(), а не просто установить изображение drawable в null. Если вы не позвоните clear(), асинхронная загрузка, завершающая из строя, все еще может вызвать проблемы с переработкой представления. Ваш код должен выглядеть так:

@Override 
public void onBindViewHolder(ViewHolder holder, int position) {
    if (parseList.get(position).get("logo") != null) {
        ParseFile image = (ParseFile) parseList.get(position).get("logo");
        String url = image.getUrl();
        Glide.with(context) 
                .load(url)
                .placeholder(R.drawable.piwo_48)
                .transform(new CircleTransform(context)) 
                .into(holder.imageView);
    } else {
        // make sure Glide doesn't load anything into this view until told otherwise
        Glide.clear(holder.imageView);
        // remove the placeholder (optional); read comments below
        holder.imageView.setImageDrawable(null);
    }
} 

Возможно, вам нужно попробовать что-то вроде этого

.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))

пример :

Glide.with(context)
                .load(url)
                .placeholder(R.drawable.progress_animation)
                .crossFade()
                .signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
                .error(R.drawable.image_error_404)
                .into(iv);

когда "логотип" равен null, вы получаете переработанное изображение вместо его очистки. Добавьте этот код, чтобы правильно очистить изображение:

holder.imageView.setImageDrawable(null);

на RecyclerView каждая строка перерабатывается с новыми данными. В вашем коде вы устанавливаете ImageView только когда это не null и больше ничего не делать. В этом случае, когда это не null ImageView покажет старое изображение, так как вы не override для текущего объекта. Вы можете исправить это, добавив условие else и установив ImageView для null / пустого ничего.

@Override 
    public void onBindViewHolder(ViewHolder holder, int position) {
        if(parseList.get(position).get("logo") != null){
            ParseFile image = (ParseFile) parseList.get(position).get("logo");
            String url = image.getUrl();
            Glide.with(context) 
                    .load(url)
                    .placeholder(R.drawable.piwo_48)
                    .transform(new CircleTransform(context)) 
                    .into(holder.imageView);


        } 
        else{
            holder.imageView.setImageDrawable(null);
        }
    } 

Я думаю, это потому, что ваш адаптер имеет адаптер.setHasStableIds (true) является true и getItemId не переопределяет. Поэтому recyclerView пытается найти держатель с тем же идентификатором и повторно использовать его.