Подтвердить что ты не робот

Recycliewiew Adapter и Glide - одинаковое изображение каждые 4-5 строк

У меня есть эта проблема - только для целей тестирования я добавил ParseFile в один из ParseObject из полученного списка. Вместо того, чтобы показывать его только в этой строке, он показывает каждые 4-5 строк, иногда больше, а иногда и меньше. Я полагаю, что обращение к переработке имеет какое-то отношение к этому. Как ни странно, другие данные (удаленные из этого примера) отлично работают с переменной 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);


        }

    }
4b9b3361

Ответ 1

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

Вам нужно вызвать Glide#clear(), а не просто установить изображение для рисования на ноль. Если вы не позвоните 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 does not load anything into this view until told otherwise
        Glide.clear(holder.imageView);
        // remove the placeholder (optional); read comments below
        holder.imageView.setImageDrawable(null);
    }
} 

Ответ 2

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

.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);

Ответ 3

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

holder.imageView.setImageDrawable(null);

Ответ 4

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

@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);
        }
    } 

Ответ 5

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