Скользящее изображение не отображается при использовании JSON, но отображается при использовании статического URL-адреса

#android #kotlin #android-glide

Вопрос:

Я использую @GET для извлечения данных из файла JSON. И у меня есть recyclerview, и данные из JSON загружаются в этот recyclerview. Просмотр вторсырья содержит просмотр изображений и 2 просмотра текста. Я использую GLIDE для просмотра изображения в окне просмотра вторсырья. Но когда я использую статический URL-адрес из того же файла JSON, отображается изображение. Но когда я меняю его, ничего не видно. Коды приведены ниже.

АбиДата.кт

 data class AbiData(
val id: String,
val img_src: String,
val price: Int,
val type: String)
 

АпиИнтерфейс.кт

 interface ApiInterface {
@GET("realestate")
fun getData(): Call<List<AbiData>>}
 

Адаптер для переработки.кт

 class abiAdapter (val context: Context, val userList: List<AbiData>) : RecyclerView.Adapter<abiAdapter.ViewHolder>() {

class ViewHolder (itemView: View) : RecyclerView.ViewHolder(itemView) {
    val type : TextView = itemView.findViewById(R.id.type)
    val price : TextView = itemView.findViewById(R.id.price)
    val marsImage : ImageView = itemView.findViewById(R.id.marsImage)

}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): abiAdapter.ViewHolder {
    return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.rows,parent,false))
}

override fun onBindViewHolder(holder: abiAdapter.ViewHolder, position: Int) {
    val currentItem = userList[position]

    holder.type.text = currentItem.type
    holder.price.text = currentItem.price.toString()
    Glide.with(context).load(currentItem.img_src).centerCrop().placeholder(R.drawable.ic_launcher_foreground).into(holder.marsImage)


}

override fun getItemCount(): Int {
    return userList.size
}
 

}

На «onBindViewHolder» в Recyclerview измените следующую строку на «ниже», изображение отображается правильно Glide.with(context).load(«https://mars.nasa.gov/msl-raw-images/msss/01000/mcam/1000MR0044631300503690E01_DXXX.jpg»).centerCrop().placeholder(R. drawable.ic_launcher_foreground).into(holder.marsImage)

Но при изменении на Glide.with(контекст).load(CurrentItem.img_src).в(держатель.marsImage) Изображение не отображается

В CurrentItem.img_src : Получен правильный URL-адрес. Я проверил это с помощью точки останова.

введите описание изображения здесь

Результат показан ниже

введите описание изображения здесь

FragmentRecycler.xml

 <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".RecyclerFragment">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@ id/abiRecyclerView"
        android:layout_width="match_parent"
        tools:listitem="@layout/rows"
        android:layout_height="match_parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>
 

row.xml

 <?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="wrap_content"
    app:cardCornerRadius="20dp"
    android:layout_marginTop="10dp"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    app:cardBackgroundColor="#F4E6D7"
    android:layout_width="match_parent"
        xmlns:tools="http://schemas.android.com/tools">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="180dp">

        <ImageView
            android:id="@ id/marsImage"
            android:layout_width="170dp"
            android:layout_height="164dp"
            android:layout_marginStart="16dp"
            android:layout_marginTop="8dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>

        <TextView
            android:id="@ id/price"
            android:layout_width="174dp"
            android:textSize="30sp"
            android:layout_height="33dp"
            android:textStyle="bold"
            android:layout_marginStart="20dp"
            android:layout_marginTop="88dp"
            android:text="TextView"
            app:layout_constraintStart_toEndOf="@ id/marsImage"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@ id/type"
            android:layout_width="wrap_content"
            android:textStyle="bold"
            android:layout_height="wrap_content"
            android:layout_marginTop="36dp"
            android:text="TextView"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.119"
            app:layout_constraintStart_toEndOf="@ id/marsImage"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
 

Logcat

 2021-06-08 13:00:08.821 1390-1390/com.example.mars W/Glide: Load failed for http://mars.jpl.nasa.gov/msl-raw-images/msss/01000/mcam/1000MR0044631280503688E0B_DXXX.jpg with size [468x451]
    class com.bumptech.glide.load.engine.GlideException: Failed to load resource
    There was 1 root cause:
    com.bumptech.glide.load.HttpException(Failed to connect or obtain data, status code: -1)
     call GlideException#logRootCauses(String) for more detail
      Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class java.io.InputStream, REMOTE
    There was 1 root cause:
    com.bumptech.glide.load.HttpException(Failed to connect or obtain data, status code: -1)
     call GlideException#logRootCauses(String) for more detail
        Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Fetch failed
    There was 1 root cause:
    com.bumptech.glide.load.HttpException(Failed to connect or obtain data, status code: -1)
     call GlideException#logRootCauses(String) for more detail
          Cause (1 of 1): class com.bumptech.glide.load.HttpException: Failed to connect or obtain data, status code: -1
 

Комментарии:

1. Почему вы используете ${} для доступа к пути от объекта? Хорошо, я вижу, вы используете строку. Используйте прямую загрузку(CurrentItem.img_src), ваш код выглядит хорошо

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

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

4. Теперь я добавляю Logcat в вопрос. Но я не понял, в чем дело

Ответ №1:

Вы пробовали использовать простое использование скольжения, как это?

   Glide.with(this).load("url").into(imageView);
 

Как это работает с Пикассо?

Опубликуйте также xml.

убедитесь, что вы используете последнюю версию glide.

Ответ №2:

Спасибо всем, кто мне отвечает. Я выясняю проблему. Я добавляю следующую строку в Androidmanifest.xml метка файла.

 android:usesCleartextTraffic="true"
 

Комментарии:

1. Вы не должны этого делать. Это может привести к угрозам безопасности.

2. Тогда что же делать?

3. включить CleartextTraffic позволяет запрашивать hhtp для устройств выше версии 9 . это было причиной.

Ответ №3:

  1. 1-я проверка api корректно отправляет данные с помощью почтальона.
  2. установите для адаптера значение recyclerview в ответе api или notifyitemchanged в onsuccess для вашего метода api.
  3. если api правильно отправляет данные, проверьте, доступно ли изображение, используя ссылку, которую ваш api отправляет обратно.

Комментарии:

1. В списке пользователей. Img_src : Получен правильный URL-адрес изображения. Я проверяю это с помощью точки останова.

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

3. mars.nasa.gov/msl-raw-images/msss/01000/mcam/…