У меня может быть только 20 изображений при использовании RecyclerView, Glide, Volley и ImageView - PullRequest
0 голосов
/ 11 июля 2020

Недавно хочу посмотреть исходники 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

1 Ответ

0 голосов
/ 12 июля 2020

Причина в том, что pixabay по умолчанию per_page = 20

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...