Recyclerview не обновляется в сопрограмме - PullRequest
0 голосов
/ 19 февраля 2020

Привет! Я получаю информацию из Интернета с помощью jsoup и сопрограммы, и я хочу показать данные в программе повторного просмотра. Вся информация получена, но RecyclerView ничего не показывает, и представление не обновляется

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)
    }

и это происходит

var itemsData = ArrayList<DataModel>()

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

        itemsrv.setHasFixedSize(true)
        itemsrv.layoutManager = llm
        getData()
        itemsrv.adapter = adapter

1 Ответ

0 голосов
/ 20 февраля 2020

В этом коде есть множество ошибок (например, getData никогда не устанавливает адаптер на RecyclerView), но самая большая проблема заключается в том, что вы на самом деле не ждете заполнения listx - вы возвращая его непосредственно перед тем, как он будет заселен Вам необходимо либо перенести заполнение адаптера в сопрограмму и запустить эту часть в диспетчере потоков пользовательского интерфейса, либо использовать обратный вызов, либо отправить его в поток пользовательского интерфейса. Запуск сопрограммы и немедленный возврат не заставляют данные заполняться, когда кто-то пытается их использовать.

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