заполнять прядильщик с модифицированным и моши

Я новичок в android dev (как java, так и kotlin). Я пытаюсь заполнить spinner от json с помощью модификации и moshi, но я не знаю, как заполнить его в spinner. честно говоря, я не знаю, правильно ли возвращено Json-данных или нет, так как Log.d () return не является детальным как dump () laravel или php.

script в действии onCreate (Пожалуйста, прочитайте комментарий к скрипту, я положил результат отладки Log.d() там):

 val task = object : AsyncTask<Void, Void, Response<List<ProductTypeResponse>>>() { override fun doInBackground(vararg params: Void): Response<List<ProductTypeResponse>> { val typeAPI = RestAPI() val callResponse = typeAPI.getNews() val response = callResponse.execute() return response } override fun onPostExecute(response: Response<List<ProductTypeResponse>>) { if (response.isSuccessful) { val news = response.body() Log.d("test:", news!![0].data.toString()) // method 'java.lang.String com.example.mockie.tigaer.api.TypeDataResponse.toString()' on a null object reference Log.d("test:", news!!.size.toString()) // it says 67 but the data from the url is 63 array of json object Log.d("test:", news!![0].toString()) // com.example.mockie.tigaer.api.ProductTypeResponse@f17fd5e } } 

RestApi.kt

 import retrofit2.Call import retrofit2.Retrofit import retrofit2.converter.moshi.MoshiConverterFactory class RestAPI() { private val tigaerApi: TigaerApi init { val retrofit = Retrofit.Builder() .baseUrl("http://app.tigaer.id/laravel/") .addConverterFactory(MoshiConverterFactory.create()) .build() tigaerApi = retrofit.create(TigaerApi::class.java) } fun getNews(): Call<List<ProductTypeResponse>> { return tigaerApi.getTop() } } 

ApiModel.kt

 package com.example.mockie.tigaer.api class ProductTypeResponse(val data: TypeDataResponse) class TypeDataResponse( val children: List<ProductTypeChildrenResponse> ) class ProductTypeChildrenResponse(val data: ProductTypeDataResponse) class ProductTypeDataResponse( val productType: String, val readable: String ) 

TigaerApi.kt

 import retrofit2.Call import retrofit2.http.GET import retrofit2.http.Query interface TigaerApi { @GET("api/type") fun getTop(): Call<List<ProductTypeResponse>> } 

return Json: https://jsoneditoronline.org/?id=ce90c41b859218e746e41d64eddb4c30

поэтому мои вопросы:

  1. есть ли какая-либо функция для отладки объекта / массива как детали, как в laravel?
  2. как заполнить мои данные возврата json в spinner?

Вот код для того же самого, я модифицировал и интегрировал только в ваш код:

Класс «MainActivity.kt»:

  class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) var spinner: Spinner = findViewById(R.id.spinner) val task = object : AsyncTask<Void, Void, Response<List<ProductTypeDataResponse>>>() { override fun doInBackground(vararg params: Void): Response<List<ProductTypeDataResponse>> { val typeAPI = RestAPI() val callResponse = typeAPI.getNews() val response = callResponse.execute() return response } override fun onPostExecute(response: Response<List<ProductTypeDataResponse>>) { if (response.isSuccessful) { val news: List<ProductTypeDataResponse>? = response.body() var adapter: SpinnerAdapter = SpinnerAdapter(this@MainActivity, news!!); spinner.adapter=adapter } } }.execute() } } 

Теперь макет «activity_main» ::

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.ankitpatidar.checkkotlin.MainActivity"> <Spinner android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/spinner"></Spinner> </LinearLayout> 

Теперь адаптер Spinner как «SpinnerAdapter» ::

  class SpinnerAdapter internal constructor(internal var context: Context, internal var list: List<ProductTypeDataResponse>) : BaseAdapter() { override fun getCount(): Int { return list.size } override fun getItem(i: Int): Any? { return null } override fun getItemId(i: Int): Long { return 0 } override fun getView(i: Int, view: View?, viewGroup: ViewGroup): View { var view = view if (view == null) { val inflater = LayoutInflater.from(context) view = inflater.inflate(R.layout.item, viewGroup, false) } val textView = view!!.findViewById<TextView>(R.id.textView) textView.text = list[i].productType + " " + list[i].readable return textView } } 

Разметка элемента Spinner как «item» ::

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textView"/> </LinearLayout> 

Теперь некоторые изменения в существующих файлах ::

"ApiModel.kt" ::

  class TypeDataResponse( val children: List<ProductTypeChildrenResponse> ) class ProductTypeChildrenResponse(val data: ProductTypeDataResponse) class ProductTypeDataResponse( val productType: String, val readable: String ) 

"RestAPI.kt"

  class RestAPI() { private val tigaerApi: TigaerApi init { val retrofit = Retrofit.Builder() .baseUrl("http://app.tigaer.id/laravel/") .addConverterFactory(MoshiConverterFactory.create()) .build() tigaerApi = retrofit.create(TigaerApi::class.java) } fun getNews(): Call<List<ProductTypeDataResponse>> { return tigaerApi.getTop() } } 

Следовательно, это сработает для вас.

Пожалуйста, следуйте всем файлам, дайте мне знать, если потребуется какая-либо помощь.

Благодарю.

есть ли какая-либо функция для отладки объекта / массива как детали, как в laravel?

Пройдите это, чтобы запустить приложение в режиме отладки. https://developer.android.com/studio/debug/index.html

Вы всегда можете использовать точки останова для оценки выражений во время работы приложения. Вместо того, чтобы регистрировать, установите точку останова в этой строке.

  val news = response.body() 

поэтому, когда вы получите ответ от сервера, приложение остановится в этот момент, и вы сможете проверить, что вы получаете в ответ в деталях.

как заполнить мои данные возврата json в spinner?

Если вы получаете ответ от сервера в формате Json, как показано в предоставленной ссылке, вам придется проанализировать данные в списке объектов (POJO). И тогда вам нужно переслать эти данные (возможно, вам придется перебирать список, чтобы получить требуемые данные, потому что у вас есть два поля в каждом объекте) в адаптер и установите этот адаптер на свой счетчик. Это объясняется очень четко по следующей ссылке. https://developer.android.com/guide/topics/ui/controls/spinner.html

Intereting Posts
Сохранить сторонний объект в ORM Сгладить итератор двумерного массива в Котлине Kotlin Передача ListArray в другую активность с использованием Parcelable Kotlin переопределяет абстрактное поведение val, объект vs class Vert.x chunked отвечает данными из базы данных с использованием BLOB и спящего режима Intellij Idea не будет компилировать kotlin, но maven делает Обращение с шаблоном FreeMaker с Ktor Kotlin Установить значение поля без вызова метода set – Kotlin Комната (AAC): Ошибка SQL или отсутствующая база данных (рядом с «group»: синтаксическая ошибка) RxJava 2 требует другого типа возвращаемого типа, чем RxJava 1 (Kotlin) Как получить вызывающую функцию функции kotlin Неожиданная разница типов между эквивалентным Java и кодом потока Kotlin Почему у Kotlin есть два синтаксиса для lambdas / анонимных функций? Ошибка компилятора Kotlin в Raspberrypi2 Является ли экземпляр более дорогостоящим, чем вспомогательный объект val?