Android - как остановить перезагрузку изображений в Recyclerview при прокрутке

Я создавал приложение для загрузки изображений из интернета в карты. Я использую Recyclerview для целей листинга. Для загрузки изображений я пробовал Picasso, universal-image-downloader и другие пользовательские методы, но везде у меня есть эта проблема:

всякий раз, когда я прокручиваю вниз и вверх изображения в imageview перезагружаются. Я даже сохранил условие, чтобы проверить, содержит ли imageview изображение, но это также не работает, или мой код может быть неисправен. Но я не смогли найти решение этой проблемы. Ниже я прикрепил функцию "onBindViewHolder" моего кода, который, я думаю, является проблемной частью. Здесь images-Это строковый arraylist, содержащий URL-адреса изображений.

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {            
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.default_card, parent, false);

        ViewHolder viewHolder;
        viewHolder = new ViewHolder(view);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {            
        String url = images.get(position);

        if (holder.imgView.getDrawable() != null) {
            //Do Nothing
        } else {                
            ImageLoader.getInstance().displayImage(url, holder.imgView);               
        }
    }

3 ответов


сначала в вашем коде есть ошибка - вы должны удалить условие из onBindViewHolder. Все!--3--> экземпляры должны обновляться каждый раз, когда они собираются отображаться.

@Override
public void onBindViewHolder(ViewHolder holder, int position) {            
    String url = images.get(position);               
    ImageLoader.getInstance().displayImage(url, holder.imgView);               
}

перегрузочная часть:

проблема в том, что вы, вероятно, не используя кэш (в памяти или на диске). Я бы не стал подробно останавливаться на этом, кэширование изображений в представлениях коллекции-действительно распространенная проблема, и я уверен, что быстрый поиск StackOverflow даст у тебя много результатов.

просто в частности - универсальный образ по умолчанию кэширование не включено вы можете включить его таким образом.

DisplayImageOptions options = new DisplayImageOptions.Builder()
    ...
    .cacheInMemory(true)
    .cacheOnDisk(true)
    ...
    .build();
ImageLoader.getInstance().displayImage(imageUrl, imageView, options); // Incoming options will be used

или вы можете установить его глобально для вашего приложения, просто проверить документы.


можно использовать .fit() с Пикассо. Надеюсь, это решит вашу проблему

Picasso.with(persons.get(i).context)
    .load(persons.get(i).photoId)
    .placeholder(R.drawable.placeholder)
    .fit()
    .into(personPhoto);

Если вы не хотите использовать кэш, вы можете использовать setItemViewCacheSize(размер) и указать размер, где вы не хотите перезагружать. Вот и все. Recyclerview версии 24.0.0