2015-05-14 3 views
8

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

При прокрутке вниз и вверх изображения в образе просмотра обновляются. Я даже сохранил условие, чтобы проверить, содержит ли изображение изображение, но это также не работает, или мой код может быть неисправен. Но я не могу найти решение этой проблемы. Ниже я добавил функцию onBindViewHolder моего кода, которая, я думаю, является проблематичной частью. Здесь изображения представляют собой строковый 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);    
     } 
    } 
+1

«Всякий раз, когда я прокручиваю вниз и вверх по изображениям в образе просмотра, их перезагружают» - что это значит? «или мой код может быть неисправен» - да, он неисправен. Это не привязывает новое изображение к этому «ImageView», когда «ViewHolder» перерабатывается. – CommonsWare

ответ

1

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

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

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

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

В частности - Универсальное изображение does not have caching enabled by default Вы можете включить его таким образом.

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

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

+0

Я уже установил параметры cacheInMemory и cacheInDisk. Я не знаю, почему это не сработало до этого, но удаление условия сделало трюк, но все же я могу видеть, когда я прокручиваю вниз некоторые новые изображения меняются, но только несколько. – RattusRattus

0

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

0

Вы можете использовать .fit() с Picasso. Надеюсь, что решает вашу проблему.

Picasso.with(persons.get(i).context) 
    .load(persons.get(i).photoId) 
    .placeholder(R.drawable.placeholder) 
    .fit() 
    .into(personPhoto); 
Смежные вопросы