首页 > 解决方案 > 在 Kotlin 中对 json 中的数据进行排序

问题描述

我有来自 json 文件的数据,这些数据显示在我的应用程序的 recyclerview 中。我正在尝试按year对这些数据进行排序。这就是我的代码的样子:

在 MainActivity.kt 中发生的一切都在 fetchJson() 函数中

private fun fetchJson(jsonUrl: String) {
    Log.d(TAG, "Attempting to fetch json")

    val request = okhttp3.Request.Builder().url(jsonUrl).build()

    val client = OkHttpClient()
    client.newCall(request).enqueue(object: Callback {
        override fun onFailure(call: Call, e: IOException) {
            Log.d(TAG, "Failed to execute request")
        }

        override fun onResponse(call: Call, response: Response) {
            val body = response.body()?.string()
            Log.d(TAG, "$body")

            val gson = GsonBuilder().create()

            val homeFeed = gson.fromJson(body, HomeFeed::class.java)
            homeFeed.standups.sortedWith(compareBy({it.year}))

            runOnUiThread {
                rv.adapter = Adapter(homeFeed)
            }
        }
    })
}

    fun <T> compareBy(vararg selectors: (T) -> Comparable<*>?): Comparator<T> {
        return Comparator<T> { a, b -> compareValuesBy(a, b, *selectors) }
    }

HomeFeed 课程在这里:

class HomeFeed(val standups: List<StandUps>)

和数据类 StandUps:

data class StandUps(
        val artist: String,
        val title: String,
        val year: String,
        val poster: String,
        val description: String,
        val netflix_link: String,
        val imdb_rate: String,
        val imdb_link: String,
        val duration_min: String
)

它不显示任何错误或警告,它只是不做任何事情。我怎么能做到这一点?

标签: androidsortingkotlin

解决方案


您必须首先将排序列表存储在另一个变量中,然后使用该变量将其传递给您的adapter

val homeFeed = gson.fromJson(body, HomeFeed::class.java)
            val sortedHomeFeed = homeFeed.standups.sortedWith(compareBy({it.year}))

            runOnUiThread {
                rv.adapter = Adapter(sortedHomeFeed)
            }

这样做的原因是,没有按照不变性的概念对原始列表进行更改。


推荐阅读