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