Glide генерирует ImageView с размером 0

#android #imageview #android-glide

#Android #imageview #android-glide

Вопрос:

Я создаю простое приложение для Android с использованием Glide. Функция проста: приложение отправляет сетевой запрос и возвращает список URL-адресов изображений. Затем, используя Glide и RecyclerView, я хочу отобразить изображения.

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

Вот макет держателя представления моего RecyclerView:

 <androidx.constraintlayout.widget.ConstraintLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@ id/image_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:scaleType="center"
        android:layout_marginTop="12dp"
        android:layout_marginStart="16dp"
        android:layout_marginEnd="16dp" />

</androidx.constraintlayout.widget.ConstraintLayout>
 

И вот код моего держателя представления:

 class PhotoViewHolder(private val binding: PhotoViewHolderBinding): RecyclerView.ViewHolder(binding.root) {
    fun bind(imageUrl: String?) {
        if (imageUrl != null) {
            Glide.with(binding.imageView).load(imageUrl).into(binding.imageView)
        }
    }
}
 

Однако происходит то, что я ничего не вижу на своем экране. Используя инспектор компоновки, я обнаружил, что ImageViews есть, они имеют только 0 высоты и 0 ширины:

Скриншот инспектора компоновки

Интересно, почему это так.

Ответ №1:

Я обнаружил, что если я изменю код Glide на этот:

             Glide.with(binding.root.context)
                .asBitmap()
                .load(imageUrl)
                .into(object: CustomTarget<Bitmap>() {
                    override fun onResourceReady(
                        resource: Bitmap,
                        transition: Transition<in Bitmap>?
                    ) {
                        binding.imageView.setImageBitmap(resource)
                    }

                    override fun onLoadCleared(placeholder: Drawable?) {}
                })

 

Тогда это работает. Так что, по-видимому, он должен использовать CustomTarget . Я до сих пор не понимаю, почему.