繁体   English   中英

有人可以教我如何在我当前的代码上应用回调吗

[英]Can someone teach me how to apply callbacks on my current code

有人可以教我如何在我当前的代码中应用回调吗? 我试过应用它,但我很难轻松理解这个概念。 我已经制作了回调所需的接口,但我不知道下一步该怎么做。

它是一个 API 提取代码。 这段代码的主要思想是通过 volley 提取数据,然后将其添加到我的 recyclerview 的数据源列表中。

    fun createDataset(): ArrayList<ItemPost>{
     val url = "http://api.karawcraftventure.com/item"
     // LIST DATA VARIABLE FOR RECYCLEVIEW
     val list = ArrayList<ItemPost>()
     // VOLLEY API REQUEST
     val Queue = Volley.newRequestQueue(activity)
     val jsonObject = JsonArrayRequest(
         Request.Method.GET,url,null,
         {response ->
             try
             {
                 for (i in 0 until response.length())
                 {
                     val item : JSONObject = response.getJSONObject(i)
                     val API_Image : String = item.getString("product_url_image")
                     val API_ItemName : String = item.getString("product_name")
                     val API_Price : String = item.getString("product_price")
                     val API_Category : String = item.getString("product_category")
                     // Toast Notif if data is extracted or not
                     //Toast.makeText(context, "$API_ItemName - $API_Price - $API_Category", Toast.LENGTH_SHORT).show()
                     list.add(ItemPost(API_Image, API_ItemName, API_Category, API_Price))
                 }

             }
             catch (e: JSONException)
             {
                 e.printStackTrace()
             }
         },
         { error: VolleyError? -> Toast.makeText(context, error?.message.toString(), Toast.LENGTH_SHORT).show()

         }
     )
     // Sample Data for the list
     list.add(
         ItemPost("https://karawcraftventure.com/uploads/ONGLO_KC1.jpg",
             "Item Title1",
             "Item Category1",
             "Item Price1"
         )
     )
    list.add(
        ItemPost("https://karawcraftventure.com/uploads/ORIOL_KC.jpg",
            "Item Title2",
            "Item Category2",
            "Item Price2"
        )
    )
    list.add(
        ItemPost("https://karawcraftventure.com/uploads/ORIOL_KC.jpg",
            "Item Title3",
            "Item Category3",
            "Item Price3"
        )
    )
     list.add(
         ItemPost("https://karawcraftventure.com/uploads/ORIOL_KC.jpg",
             "Item Title4",
             "Item Category4",
             "Item Price4"
         )
     )
     Queue.add(jsonObject)
     return list
}

这是我创建的接口代码。

interface ItemCallback {
    fun GetItem(Ar: ArrayList<ItemPost>)
}

在此之前我也发布了一个问题,但仍然不足以让我想出解决方案。

JSON 值不会插入 ArrayList

更新:这是我调用函数 CreateDataset() 的地方:

private fun addDataSet()
{
    val data = createDataset()
    ItemAdapter.SubmitList(data)
}

然后在这里调用 addDataset()。

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    initRecyclerView()
    addDataSet()
}

快速修复:由于您在一个片段中拥有所有内容,因此您可以在收到响应时在createDataset内调用ItemAdapter.SubmitList(data)

fun createDataset() {
    ...
    { response ->
        try {
            for(...) {
                ...
                list.add(...)
            }
            ItemAdapter.SubmitList(list)
        } catch(...) {
            ...
        }
    }
    ...
}

private fun addDataSet() {
    createDataset()
}

另一种方法:通过传递 lambda 回调:


```kotlin
fun createDataset(onSuccess: (List<ItemPost>) -> Unit) {
   ...
   for(...) {
       ...
       list.add(...)
   }
   onSuccess(list)
   ...
}

private fun addDataSet() {
    createDataset { list ->
        ItemAdapter.SubmitList(list)
    }
}

这种方法比前一种方法更好,因为现在createDataset不需要对适配器的引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM