Асинхронный вызов в Kotlin не работает с RecycleView - PullRequest
0 голосов
/ 25 февраля 2020

Я борюсь с асинхронными вызовами - приложение просто падает. Я хочу загрузить JSON -файл (содержащий 100 JSON -объектов) из URL, а затем отправить его в RecyclerView.

Вот класс MainActivity:

class MainActivity : AppCompatActivity() {

    lateinit var recyclerView: RecyclerView
    lateinit var linearLayoutManager: LinearLayoutManager

    private val url = [//some address here]

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

        recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
        recyclerView.layoutManager = linearLayoutManager

        AsyncTaskHandler().execute(url)

    }

    inner class AsyncTaskHandler : AsyncTask<String, String, String>() {
        override fun onPreExecute() {
            super.onPreExecute()
        }

        override fun doInBackground(vararg url: String?): String {
            val text: String
            val connection = URL(url[0]).openConnection() as HttpURLConnection
            try {
                connection.connect()
                text = connection.inputStream.use { it.reader().use {reader -> reader.readText()} }
            } finally {
                connection.disconnect()
            }
            return text
        }

        override fun onPostExecute(result: String?) {
            super.onPostExecute(result)
            handleJson(result)
        }
    }

    private fun handleJson(jsonString: String?) {
        val jsonArray = JSONArray(jsonString)
        var list = mutableListOf<DataSet>()

        var i = 0
        while (i < jsonArray.length()) {
            val jsonObject = jsonArray.getJSONObject(i)

            list.add(DataSet(
                jsonObject.getString("title"),
                jsonObject.getString("type")
            ))
            i++
        }

        val adapter = Adapter(list)
        recyclerView.adapter = adapter
    }
}

... и класс ListAdapter:

class Adapter (private var targetData: MutableList<DataSet>): RecyclerView.Adapter<ViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.element, parent, false)
        return ViewHolder(v);
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = targetData[position]

        holder.title?.text = item.title
        holder.type?.text = item.type
    }

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

class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    var title = itemView.findViewById<TextView>(R.id.itemTitle)
    var type = itemView.findViewById<TextView>(R.id.itemType)
}


В чем здесь может быть проблема? Есть ли лучший вариант для этого?

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