2017-02-16 3 views
0

я делаю запрос API для Imgur использования Retrofit для того, чтобы получить около 40 URL, а затем отображать их в RecyclerView используя Glide как такие:Long дисплея для изображений с помощью Glide

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    Glide 
      .with(context) 
      .load(list.get(position).getLink()) // Gets the URL in my list 
      .centerCrop() 
      .placeholder(R.mipmap.placeholder) 
      .crossFade() 
      .into(holder.imageView); 
} 

Запрос получает ответило быстро, но большинство моих изображений остаются в качестве заполнителей, поскольку некоторые из них появляются по очереди позже.

Что вызывает эту задержку при отображении моих изображений? Возможно, это связано со скоростью моего подключения к Интернету?

Кроме того, мой подход правильный, когда речь заходит о «большом» количестве изображений?

EDIT: Обратите внимание, что большинство ImageView s не загружаются, даже те, которые видны для моего пользователя.

+0

Каковы размеры изображений? – OBX

+0

Это зависит от того, насколько велики изображения, сколько времени отклика API. –

+0

Формат URL-адреса «http://imgur.com/a/XXXXX», это зависит от того, анимирован ли он, его размер и т. Д. – Christopher

ответ

0

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

+0

Возможно, это проблема, некоторые изображения на imgur очень широки. Любая идея, как противостоять этой проблеме? – Christopher

+0

см. Этот [ответ] (http://stackoverflow.com/a/8033831/6177391), который может помочь вам @Christopher –

0

В Recyclerview, Glide только загружает изображения в видимых imageViews. ImageViews, которые не видны будет загружен после вас scrolldown. Это связано с recycler Недвижимость RecyclerView.

Добавить следующую строку в вас onBindViewHolder и увидеть журналы, вы поймете:

Log.w("Link", list.get(position).getLink()); 
+0

Это не моя проблема, возможно, я не был достаточно ясен. Даже ImageViews, которые видны, не загружаются. – Christopher

1

Это может быть в зависимости от подключения к Интернету. Если да, то вы можете использовать Imgur меньшие размеры, вы можете добавить один из этих письма в конце вашего файла:

  • S = Малый квадрат (90 × 90)
  • б = Большая площадь (160 × 160)
  • т = Малые эскизы (160 × 160)
  • м = средний миниатюрный (320 × 320)
  • л = Большой миниатюрные (640 × 640)
  • ч = Огромный миниатюрный (1024 × 1024)

т.е. это:

http://i.imgur.com/bF8zPs4.jpg 

становится этим (за небольшой площади):

http://i.imgur.com/bF8zPs4s.jpg 
+0

Формат моих ссылок - 'http: // imgur.com/a/xxxxx', у меня нет ссылки на местоположение изображения. – Christopher

+0

Разве это не адрес для альбомов? –

+0

Это URL-адреса из галереи (я делаю запрос API для получения списка отображаемых в настоящее время изображений на странице X галереи). – Christopher

1

После того, как вы установили URL для изображения в Glide, само изображение еще нужно загружаться и отображаться в ImageView, что вызывает задержку. Если изображения не загружаются, можете ли вы проверить, загружает ли URL-адрес изображения в вашем браузере?

Лучшим подходом к загрузке изображений в адаптер с помощью Glide является использование RequestManager, который вы передаете в конструкторе вашего адаптера. Затем Glide подписывается на жизненный цикл вашей активности фрагмента. Это предотвратит загрузку изображений, когда ваша активность фрагмента была уничтожена, что особенно полезно, когда Glide загружает большие изображения.

public MyAdapter(List<Object> items, RequestManager requestManager) { 
    this.items = items; 
    this.requestManager = requestManager; 
}  

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    requestManager 
      .load(list.get(position).getLink()) // Gets the URL in my list 
      .centerCrop() 
      .placeholder(R.mipmap.placeholder) 
      .crossFade() 
      .into(holder.imageView); 
} 

И тогда вы можете вызвать конструктор адаптера в качестве acitivty или фрагмент, как например:

MyAdapter myAdapter = new MyAdapter(items, Glide.with(this)); 

Я использую этот подход после того, как я нашел this answer from TWiStErRob.

Смежные вопросы