Salut, je reçois des informations du Web avec jsoup et coroutine et je souhaite afficher les données dans recyclerview Toutes les informations sont bien reçues mais RecyclerView n'affiche rien et la vue n'est pas mise à jour

fun myCoroutine(): ArrayList<DataModel> {
        val listx = arrayListOf<DataModel>()

        GlobalScope.launch { // launch new coroutine in background and continue
            Log.d("asdasdasd", "start")
            var doc: Document = Jsoup.connect("http://5743.zanjan.medu.ir").timeout(0).maxBodySize(0).ignoreHttpErrors(true).sslSocketFactory(setTrustAllCerts()).get()
            val table: Elements = doc.select("table[class=\"table table-striped table-hover\"]")
            for (myTable in table) {
                val rows: Elements = myTable.select("tr")
                for (i in 1 until rows.size) {
                    val row: Element = rows.get(i)
                    val cols: Elements = row.select("td")
                    val href: Elements = row.select("a")
                    val strhref: String = href.attr("href")
                    listx.add(DataModel(cols.get(2).text(),strhref))
                    Log.d("asdasf",cols.get(2).text())
                }
            }
        }
        return listx
}

 private fun getData() {
        itemsData = ArrayList()

        itemsData = myCoroutine()
        adapter.notifyDataSetChanged()
        adapter = RVAdapter(itemsData)
    }

Et c'est oncréer

var itemsData = ArrayList<DataModel>()

        adapter = RVAdapter(itemsData)
        val llm = LinearLayoutManager(this)

        itemsrv.setHasFixedSize(true)
        itemsrv.layoutManager = llm
        getData()
        itemsrv.adapter = adapter
0
user11453013 19 févr. 2020 à 21:02

1 réponse

Meilleure réponse

Ce code a de nombreux bogues (getData, par exemple, ne définit jamais l'adaptateur sur le RecyclerView), mais le plus gros problème est que vous n'attendez pas réellement que listx soit rempli - vous le retournez juste avant qu'il ne soit rempli. Vous devez soit déplacer la population de l'adaptateur vers la coroutine et exécuter cette partie sur le répartiteur de thread d'interface utilisateur, soit utiliser un rappel, soit la répartir vers le thread d'interface utilisateur. Le lancement d'une coroutine et son retour immédiat ne remplissent pas les données lorsque quelque chose essaie de les utiliser.

0
Ryan M 19 févr. 2020 à 21:53