Я хочу использовать 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 $
у кого-нибудь есть решение этой проблемы ...