[Kotlin] JSON: Array reste vide

Bonjour
cela fait un bon moment que je cherche la solution, je ne la trouve pas.

Dans la classe APIHubble, la variable _PhotoList reste vide lorsque j’essai de récupérer les infos pour mon RecyclerView

J’essaie d’obtenir des informations d’un fichier .json et de les mettre dans mon array avec « PhotosHubble » comme objet. Je vous remercie.

MainActivity:

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    APIHubble().launchJsonArrayRequest(this)

  //  println(APIHubble()._PhotoList.size) // 0


    ui_photoList.adapter = PhotoAdapter()
    ui_photoList.layoutManager = LinearLayoutManager(this)


}}

PhotosHubble :

data class PhotosHubble(var title:String, var pubDate: String, var description: String, var image: String, var thumbnail: String) 

APIHubble :

class APIHubble() {
lateinit var requestQueue: RequestQueue
var _PhotoList:MutableList<PhotosHubble> = mutableListOf()

fun launchJsonArrayRequest(context:Context) {
    val url = "https://hubblesite.org/api/v3/external_feed/st_live"
    requestQueue = Volley.newRequestQueue(context)

    val jsonArrayRequest = JsonArrayRequest(url, Response.Listener {
        for (itIndex in 0 until it.length()) {
            val item = it.getJSONObject(itIndex)

             _PhotoList.add(PhotosHubble(
                title = item.getString("title"),
                pubDate = item.getString("pub_date"),
                description = item.getString("description"),
                image = item.getString("image"),
                thumbnail = item.getString("thumbnail_large")))

        }
    // ICI CA PRINT BIEN
    }, Response.ErrorListener { println("Erreur") })
    requestQueue.add(jsonArrayRequest)

}}

PhotoAdaptater :

class PhotoAdapter : RecyclerView.Adapter<PhotoAdapter.PhotoViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PhotoViewHolder {
    // 1 - Charge la vue en XML
    val vueRacine = LayoutInflater.from(parent.context).inflate(R.layout.cell_image_hubble,parent,false)

    // 2 - Créer un viewholder pour contrôler cette vue
    val holder = PhotoViewHolder(vueRacine)

    // 3 - Retourne le view holder
    return  holder
}

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

override fun onBindViewHolder(holder: PhotoViewHolder, position: Int) {
    // 1 - Obtenir les infos
    val photoHubble = APIHubble()._PhotoList[position]

    // 2 - Envoyer les infos de la photo dans le holder
    holder.fillWithPhotos(photoHubble)
}

class PhotoViewHolder(vueRacine: View) : RecyclerView.ViewHolder(vueRacine) {
    private val descriptionView = vueRacine.descriptionView
    //private val thumbnailView = vueRacine.thumbnailView
    private val dateView = vueRacine.dateView

    fun fillWithPhotos(photosHubble: PhotosHubble) {
        descriptionView.text = photosHubble.description
        //thumbnailView.setImageResource = photoHubble.thumbnail
        dateView.text = photosHubble.pubDate
    }}}

J’ai fait un test, j’ai créé deux boutons, et j’ai attendu un peu entre le clic sur le bouton4 (Qui lance la fonction launchJsonArrayRequest) et le bouton5 (pour print _PhotoList.size), le résultat est le même, _PhotoList reste vide

Merci de votre aide !

Salut,

j’ai l’impression que tu crées un nouvel objet APIHubble (appel à du constructeur avec parenthèses APIHubble()) à chaque fois que tu t’en sers.
A chaque fois que tu crées une instance d’un objet, il commence vide.
Si tu veux que les résultat du chargement soit conservé et réutilisé, il faut que tu crées une seule fois l’objet, que tu le stocke dans une variable et que tu fasses tout le temps référence à cet objet unique quand tu en as besoin.
Garde aussi en tête que le chargement de tes données est asynchrone (Volley fait ceci pour garder ton app fluide), donc tu dois attendre la fin du chargement des données avant de pouvoir consulter la liste de photos.
Dans le cours Android, je parle des notions de chargement asynchrone dans le chapitre sur Volley. Et ensuite je montre des solutions pour attendre la fin du chargement dans la correction du TP TVShows.

J’espère avoir pu te donner quelques pistes :+1:

Happy coding

Merci beaucoup pour la réponse !
Au passage tes cours sont au top :slight_smile:

Pas faux, grosse erreur de ne pas stocker l’objet dans une variable. J’ai du mal à me familiariser avec l’orienté objet (je viens du langage C)

Et pour attendre la fin du chargement, j’y suis dessus depuis ce matin, j’ai vraiment du mal à implémenter ceci dans mon code…

1 « J'aime »

Merci! Ça représente énormément de travail donc ça fait très plaisir quand c’est remarqué :slight_smile:

Les notions de programmation asynchrones sont les plus compliquées à assimiler, mais une fois que tu y parviendras, tu auras des apps beaucoup plus performantes pour tes utilisateurs :+1: