#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-я проверка api корректно отправляет данные с помощью почтальона.
- установите для адаптера значение recyclerview в ответе api или notifyitemchanged в onsuccess для вашего метода api.
- если api правильно отправляет данные, проверьте, доступно ли изображение, используя ссылку, которую ваш api отправляет обратно.
Комментарии:
1. В списке пользователей. Img_src : Получен правильный URL-адрес изображения. Я проверяю это с помощью точки останова.
2. можете ли вы поделиться URL-адресом, если это возможно, потому что ваш код загрузки изображения в порядке.