Android Привязка данных Glide - ждать URL - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь использовать Glide для загрузки изображения во фрагмент. Я вызываю службу, которая возвращает URL-адрес изображения с помощью Retrofit и сопрограмм. Итак, мой фрагмент имеет что-то вроде:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceBundle: Bundle?) : View? {
   val binding = DataBindingUtil.inflate(...)
   viewModel.retrieveImageUrl()
   view.imageUrl.observe(viewLifecycleOwner, Observer {
      imageUrl = it
   })
   binding.imageUrl = imageUrl
   return binding.root
}

И мой адаптер привязки имеет

@BindingAdapter("imageResource")
fun loadImage(view: ImageView, url: String?) {
   if(!url.isNullOrEmpty()) {
      Glide.with(view).load(url).diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true).into(view)
   }
}

Layout (сокращено для краткости)

<layout>

   <data>
      <variable
         name="imageUrl"
         type="String" />
   </data>

   <ImageView
      app:imageResource="@{imageUrl}" />

</layout>

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

1 Ответ

0 голосов
/ 06 августа 2020

используйте свойство привязки данных ObservableField<String>(), чтобы отразить изменения позже.

или используйте MutableLiveData<String>()

, например.

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceBundle: Bundle?) : View? {
   val imageUrl= ObservableField<String>()
   val binding = DataBindingUtil.inflate(...)
   viewModel.retrieveImageUrl()
   view.imageUrl.observe(viewLifecycleOwner, Observer {
      imageUrl.set(it)
   })
   binding.imageUrl = imageUrl
   return binding.root
}

и в макете

<layout>

   <data>
     <variable
        name="imageUrl"
        type="androidx.databinding.Observable" />
   </data>

   <ImageView
      app:imageResource="@{imageUrl}" />

</layout>

лучше использовать

...