Android:如何用改造填充 arraylist (Kotlin)

Android: how fill arraylist with retrofit (Kotlin)

我正在尝试获取通过改装收集的所有数据并将其存储在数组列表中,当我调试循环时数据就在那里但是当我 return 它在下面时它已经消失了

fun ListRecipe() : ArrayList<RecipeObj> {
        var obj: ArrayList<RecipeObj> = ArrayList<RecipeObj>()
      //  RecipeLiveData = MutableLiveData<hitsobj>()
        val retrofit: Retrofit = Retrofit.Builder()
                .baseUrl(Credentials.Url)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
        val service: ApiService = retrofit.create<ApiService>(ApiService::class.java)
        service.getAllRecipe("rice", Credentials.App_Id, Credentials.App_Key).enqueue(object : Callback<RecipeObj> {
            override fun onResponse(
                    call: Call<RecipeObj>, response: Response<RecipeObj>?) {

                val recetas: RecipeObj? = response!!.body()
                var list = listOf(recetas)
                  for(receta in list){
                      obj.add(receta!!)
                 }
            }
            override fun onFailure(call: Call<RecipeObj>, t: Throwable) {
                Log.e(TAG, t.message.toString())
            }
        })
        var test = obj
        return(obj)
    }

由于API从后端加载数据需要一些时间,所以你在调用API之后返回,而不是在成功响应时,我建议你使用接口作为回调得到你的 API.

的回应

这是您问题的解决方案。

// generic interface to take callback
interface RetrofitCallBack<T> {
    fun onSuccess(t : T)
    fun onError(throwable: Throwable)
}

// use callback
fun getListOfRecipe(retrofitCallBack: RetrofitCallBack<List<RecipeObj>>) {

    //  RecipeLiveData = MutableLiveData<hitsobj>()
    val retrofit: Retrofit = Retrofit.Builder()
        .baseUrl(Credentials.Url)
        .addConverterFactory(GsonConverterFactory.create())
        .build()
    val service: ApiService = retrofit.create<ApiService>(ApiService::class.java)

    service.getAllRecipe("rice", Credentials.App_Id, Credentials.App_Key).enqueue(object : Callback<RecipeObj> {

        override fun onResponse(
            call: Call<RecipeObj>, response: Response<RecipeObj>?) {

            val recetas: RecipeObj? = response!!.body()
            retrofitCallBack.onSuccess(listOf(recetas))
        }

        override fun onFailure(call: Call<RecipeObj>, t: Throwable) {
            retrofitCallBack.onError(t)
        }
    })
}

// call func like this
fun fetchListOfRecipes() {
    getListOfRecipe(object : RetrofitCallBack<List<RecipeObj>>{
        override fun onSuccess(t: List<RecipeObj>) {
            // get your list here
        }

        override fun onError(throwable: Throwable) {
            // get error here
        }
    })
}