Arraylist от json и использовать его в recyclerView в Kotlin - PullRequest
1 голос
/ 20 января 2020

Я хочу использовать json в Kotlin для приложения погоды и специально для прогноза, и я хочу показать прогноз в виде списка ...

У меня есть этот класс данных от 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 = Interceptor{chain ->

                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)




        }



    }

}

это мой адаптер для повторного использования

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, но был BEGIN_OBJECT в строке 1, путь 2, столбец 2 $

у кого-нибудь есть решение этой проблемы ...

1 Ответ

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

Ваш класс данных является представлением JSON ОБЪЕКТА. Ошибка говорит, что ваш код ожидает JSON ARRAY. Исследуйте разницу между этими двумя. Также показаны полные сообщения об ошибках справки.

...