I've only been getting started with Android Studio + kotlin for a short time and I'm still mixing some concepts. I am trying to do the following:
- I run a function called run_service () where I get an array from a json response. (This I have achieved)
I'm trying to pass this array to my MyCustomAdapter , which generates a listView but I can't pass the data.
class HomeFragment : Fragment() { //Este es un array que he tratado de hacer global y donde guardo la consulta web var nombres_establecimientos = arrayListOf<String>() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { //Ejecuto el servicio que hace la llamada json ejecutar_servicio() val listView = root.findViewById<ListView>(R.id.listView) //Aqui he pensando en pasar el array que en la otra función se rellenó, a la clase, pero no lo consigo. listView.adapter = getActivity()?.let { MyCustomAdapter(it, nombres_establecimientos) } // this needs to be my custom adapter telling my list what to render // Inflate the layout for this fragment return root } private class MyCustomAdapter(context: Context, arr: ArrayList<String>): BaseAdapter() { private val nombres_establecimientos = arr .... override fun getView(position: Int, convertView: View?, viewGroup: ViewGroup?): View { val layoutInflater = LayoutInflater.from(mContext) val rowMain = layoutInflater.inflate(R.layout.row, viewGroup, false) println(">Nombres_establecimientos3: ${nombres_establecimientos}") val nameTextView = rowMain.findViewById<TextView>(R.id.textView1) nameTextView.text = nombres_establecimientos.get(position) val descriptionTextView = rowMain.findViewById<TextView>(R.id.textView2) descriptionTextView.text = nombres_establecimientos.get(position) return rowMain } class Establecimiento( var id: Int, var nombre: String, var direccion: String ) { override fun toString(): String { //return "Category [id: ${this.id}, nombre: ${this.nombre}, direccion: ${this.direccion}]" return this.nombre } } } //Esta es la función donde recibo los datos de la consulta a la api json, hay varios println donde confirmo que si recibo los datos. private fun ejecutar_servicio(): Array<MyCustomAdapter.Establecimiento?> { val url = "url/api/respuesta_json" val request = Request.Builder().url(url).build() val client = OkHttpClient() client.newCall(request).enqueue(object: Callback { override fun onResponse(call: Call?, response: Response?) { val body = response?.body()?.string() println(body) val gson = Gson() val arrayEstablecimientoType = object : TypeToken<Array<MyCustomAdapter.Establecimiento>>() {}.type var resultados: Array<MyCustomAdapter.Establecimiento> = gson.fromJson(body, arrayEstablecimientoType) resultados.forEachIndexed { idx, item -> println("> Item ${idx}: ${item}") nombres_establecimientos.add(item.toString()) } println(">Nombres_establecimientos: ${nombres_establecimientos}") } override fun onFailure(call: Call?, e: IOException?) { println("Failed to execute request") } }) return emptyArray() }
What am I doing wrong?
In
ejecutar_servicio()
you are making a network call, which is running in the background, this means that the code will initialize the Adapter while the service is running, so the list will still be empty.You should initialize the Apdater after the service ends.