谁能教我如何在我当前的代码上应用回调
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
以使用新数据更新回收器视图
有人可以教我如何在我当前的代码中应用回调吗?我试过应用它,但我很难轻易理解这个概念。我已经制作了回调所需的接口,但我不知道下一步该做什么。
这是一个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
以使用新数据更新回收器视图