来自json的Arraylist并在Kotlin的recyclerView中使用它

Posted

技术标签:

【中文标题】来自json的Arraylist并在Kotlin的recyclerView中使用它【英文标题】:Arraylist from json and use it in recyclerView in Kotlin 【发布时间】:2020-05-06 18:53:52 【问题描述】:

我想在 Kotlin 中将 json 用于天气应用程序,特别是用于预测,我想将预测显示为列表...

我有这个来自 json 的数据类

data class X(
    val clouds: Clouds,
    val dt: Int,
    @SerializedName("dt_txt")
    val dtTxt: String,
    val main: Main,
    val snow: Snow,
    val sys: Sys,
    val weather: List<Weather>,
    val wind: Wind
) 

这是我的服务

import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET
private const val API_KEY = "de557725bd9504e26ff45267e4c3d806"

interface  ForcastServices
    @GET("forecast")
    fun  getWeatherList(
        @retrofit2.http.Query("lat") lat :Double,
        @retrofit2.http.Query("lon") lon :Double
    ): Deferred<List<Weather>>


    companion object

        operator fun invoke() :ForcastServices
            val requestInterceptor = Interceptorchain ->

                val url =chain.request()
                    .url()
                    .newBuilder()
                    .addQueryParameter("APPID", API_KEY)
                    .build()
                val request =chain.request()
                    .newBuilder()
                    .url(url)
                    .build()

                return@Interceptor chain.proceed(request)

            

            val okHttpClient = OkHttpClient.Builder()
                .addInterceptor(requestInterceptor)
                .build()

            return Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl("http://api.openweathermap.org/data/2.5/forecast?")
                .addCallAdapterFactory(CoroutineCallAdapterFactory())
                .addConverterFactory(GsonConverterFactory.create())
                .build()
                .create(ForcastServices::class.java)




        



    


这是我的 recyclerview 适配器

class RecyclerAdapterForcast(val weaTher: List<Weather>) :
    RecyclerView.Adapter<ForcastViewHolder>() 
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ForcastViewHolder 
        val fView =
            LayoutInflater.from(parent.context).inflate(R.layout.list_forcast, parent, false)
        return ForcastViewHolder(fView)
    

    override fun getItemCount(): Int 
        return weaTher.size
        //return 8
    

    override fun onBindViewHolder(holder: ForcastViewHolder, position: Int) 

        val weaTher = weaTher.get(position)
         holder.v.tex_test.text = weaTher.main





    


这是我的 MainActivity

@SuppressLint("SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val apiServices = ForcastServices()

    rec_forcast.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL ,false)
    GlobalScope.launch(Dispatchers.Main) 
        val currentForcastResponse = apiServices.getWeatherList(35.69,51.39).await()

            val weatherlist = currentForcastResponse
        rec_forcast.adapter = RecyclerAdapterForcast(weatherlist)
    

但它有一些错误.. 这些是我在项目中看到的一些错误 有时会在当天预报中返回 有时会出现此错误 java.lang.IllegalStateException:应为 BEGIN_ARRAY,但在第 1 行第 2 列路径 $

处为 BEGIN_OBJECT

任何人都有这个问题的解决方案...

【问题讨论】:

【参考方案1】:

您的 Data 类是 JSON OBJECT 的表示。错误说您的代码需要一个 JSON 数组。研究这两者之间的区别。还显示完整的错误消息帮助。

【讨论】:

我知道。但我找不到解决这个问题的解决方案.. json 链接在这里...[api.openweathermap.org/data/2.5/… API链接没有key就不行,你的问题“太大了”...尽量消除API调用,只用字符串创建一个简单的问题,这样我们可以更容易看到真实问题?该错误表明 JSON 应该以“[”(BEGIN_ARRAY)而不是“”(BEGIN_OBJECT)开头。似乎您的“天气预报”是一个对象,而不是一个数组?做一个listOf(weatherlist)也许可以解决问题? 发布错误发生的代码行。您的错误消息应显示错误发生的位置。

以上是关于来自json的Arraylist并在Kotlin的recyclerView中使用它的主要内容,如果未能解决你的问题,请参考以下文章

使用 GSON 来自 Json 的 Kotlin 数据类

如何阅读管道分隔线 |来自一个文件并在两个不同的 ArrayList 中拆分整数

在 MVVM 架构中格式化来自改造 API 的嵌套 JSON 响应 - Kotlin

将kotlin数据类转换为json字符串

从Python JSON迁移到Kotlin JVM JSON

从 JSON 检索数据但无法从 JSONobject 访问 Arraylist