谁能教我如何在我当前的代码上应用回调

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 values won't insert in 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()
}

ItemRecyclerAdapter

fun SubmitList(ItemList : List<ItemPost>)
{
    Items = ItemList
}

最终解决方案

由 ARPIT SHUKLA 解决

创建数据集函数:

    fun createDataset(onSuccess: (List<ItemPost>) -> Unit){
     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))
                 }
                 onSuccess(list)
             }
             catch (e: JSONException)
             {
                 e.printStackTrace()
             }
         },
         { error: VolleyError? -> Toast.makeText(context, error?.message.toString(), Toast.LENGTH_SHORT).show()

         }
     )
     Queue.add(jsonObject)
}

适配器中的提交列表

    fun SubmitList(ItemList : List<ItemPost>)
    {
        Items = ItemList
        notifyDataSetChanged()
    }

添加数据集函数

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

快速修复: 因为你在一个片段中包含所有内容,所以当你收到响应时,你可以在 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 不需要对适配器的引用。

此外,不要忘记在 SubmitList() 内的适配器中调用 notifyDataSetChanged 以使用新数据更新回收器视图