Недавно хочу посмотреть исходники Glide, Volley, Okhttp, чувствую, что плохо им пользовался. Я использовал его сегодня. и я не понимаю, даже Recycler не был с ним знаком и нашел его за несколько часов. Наконец, изображение отображается, но проблема в том, что их всего 20, больше 20 для запроса java .lang.IndexOutOfBoundsException: Index: 20, Size: 20 Kotlin для языка
Это это MainActivity
package com.example.simpledemo
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.android.volley.Request
import com.android.volley.RequestQueue
import com.android.volley.Response
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import com.google.gson.Gson
class MainActivity : AppCompatActivity() {
private lateinit var pixabayViewModel: PixabayViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerViewAdapter = RecyclerViewAdapter()
pixabayViewModel = ViewModelProvider(
this,
ViewModelProvider.NewInstanceFactory()
).get(PixabayViewModel::class.java)
val recyclerView = findViewById<RecyclerView>(R.id.recyclerview)
recyclerView.also {
it.adapter = recyclerViewAdapter
it.layoutManager = LinearLayoutManager(this)
}
fetchPixabay()
pixabayViewModel.mutableLiveData.observe(this, Observer {
recyclerViewAdapter.pixabay = it
})
}
fun fetchPixabay() {
val gsonUrl =
"https://pixabay.com/api/?key=17425373-62ef439ab473aae9eebbb9533&q=yellow+flowers&image_type=photo&pretty=true"
val stringRequest = StringRequest(
Request.Method.GET,
gsonUrl,
Response.Listener {
pixabayViewModel.mutableLiveData.value =
Gson().fromJson(it, Pixabay::class.java)
},
Response.ErrorListener {
Log.d("MainActivity", "fetchPixabay: request error:$it")
})
Volley.newRequestQueue(applicationContext).add(stringRequest)
}
}
这 是 Pixabay.kt
package com.example.simpledemo
import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import kotlinx.android.parcel.Parcelize
data class Pixabay(
val total:Int,
val totalHits:Int,
val hits: ArrayList<Hit>
)
@Parcelize
data class Hit(
@SerializedName("id") var id: Int,
@SerializedName("webformatURL") var webformatURL: String
) : Parcelable
Это RecyclerViewAdapter
package com.example.demo
import android.annotation.SuppressLint
import android.app.Application
import android.content.Context
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelStoreOwner
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.img_object.view.*
import java.util.zip.Inflater
class RecyclerViewAdapter() : RecyclerView.Adapter<MyViewHolder>() {
lateinit var pixabay:Pixabay
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.img_object, parent,false)
return MyViewHolder(view)
}
override fun getItemCount(): Int = pixabay.total
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
Log.i("Adapter", "onBindViewHolder: $position")
// Log.i("Adapter", "onBindViewHolder: ${pixabay.total}")
// Log.i("Adapter", "onBindViewHolder: ${pixabay.totalHits}")
Glide.with(holder.itemView).load(pixabay.hits.get(position).webformatURL)
.into(holder.itemView.imageView)
}
}
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
В activity_main есть только один ConstraintLayout и только один RecyclerView в ConstraintLayout. Адаптер адаптирован с img_object. Внутри всего один ImageView