使用改造进行 api 调用后,回收器视图中的数据未更新

问题描述 投票:0回答:1

我正在尝试进行 API 调用并获取与订单相关的所有数据并将其显示在列表中。我已经测试了以下内容,它们按预期工作。

1 - 将静态数据添加到视图中。 2 - API 调用正在返回数据并且正在正确解析。

唯一没有发生的事情是当我使用

更新适配器中的数据时

orderAdapter!!.notifyDataSetChanged() 它没有更新数据。

class OrderHistoryActivity : AppCompatActivity() {
    lateinit var recyclerView: RecyclerView
    var orderAdapter: OrderAdapter? = null
    var models: MutableList<OrderModel>? = null
    lateinit var prefs: Prefs

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_order_history)
        recyclerView = findViewById(R.id.orderRecyclerView)
        models = ArrayList()
        prefs = Prefs(this@OrderHistoryActivity)

        GlobalScope.launch(Dispatchers.Default) {
            runCatching {
                Log.d("FUNCTION", "API TO GET ORDERS INIT ${prefs.token} ${prefs.userId}")
                try {
                    val response = withTimeout(REST_API_TIMEOUT) {
                        RetrofitClient(this@OrderHistoryActivity).getApi().getOrders(
                            prefs.token, prefs.userId,"get"
                        ).execute().parseResult<OrdersResponse>()
                    }

                    Log.d("FUNCTION", "API TO GET RESULTS -> RESPONSE ${Gson().toJson(response)} ")
                    response.lastReadDate = System.currentTimeMillis()
                    var i = 0
                     (models as ArrayList<OrderModel>).clear() // CLEAR OLD LIST //
                    while (i < response.data.size) {

                        val data = response.data[i]
                        val order_id=data.id
                        val order_status=data.status
                        val order_date=data.date

                        Log.d("FUNCTION", "API TO GET IND RESULT -> RESPONSE ${order_id} ${order_status}")
                        
                        (models as ArrayList<OrderModel>).add(OrderModel("${order_id}", "Nov 20, 2024", "${order_status}"))
                        i++
                    }

                    // UPDATE DATA //
                    orderAdapter!!.notifyDataSetChanged()

                    Log.d("FUNCTION", "API TO GET IND RESULT MODELS -> RESPONSE ${models}")

                } catch (ex: RestApiException) {
                    var err = OnApiErrorEvent(ex.message ?: ex.toString())
                    Log.d("FUNCTION","rest exp")

                    Log.d("FUNCTIONwwr","${err}")
             
                } catch (ex: Exception) {
                    var err = OnApiErrorEvent(ex.message ?: ex.toString())

                  
                } catch (ex: CancellationException) {


                } finally {

                    launch(Dispatchers.Main) {
//                        viewModel.progress.set(false)
                    }
                }
            }
        }
        for (i in 0..7) {
            (models as ArrayList<OrderModel>).add(OrderModel("#14524$i", "Nov 3, 2022", "Completed"))
        }
        recyclerView.setLayoutManager(LinearLayoutManager(this@OrderHistoryActivity))
        orderAdapter = OrderAdapter(this@OrderHistoryActivity, models)
        recyclerView.setAdapter(orderAdapter)
        Log.d("FUNCTION", "RESULT - > STATIC DATA")


    }
android kotlin retrofit
1个回答
0
投票
GlobalScope.launch(Dispatchers.Default) {
    runCatching {
        // Your API call and data processing code here...
        
        // Move notifyDataSetChanged inside the Main thread block
        launch(Dispatchers.Main) {
            orderAdapter?.notifyDataSetChanged()
        }
    }
}

通过这样做,您可以确保适配器收到主线程上数据更改的通知,从而允许 UI 正确更新。

此外,请确保在调用 API 之前初始化 orderAdapter,以避免潜在的 NullPointerException。您可以通过在 API 调用之前移动适配器初始化来完成此操作:

recyclerView.layoutManager = LinearLayoutManager(this@OrderHistoryActivity)

orderAdapter = OrderAdapter(this@OrderHistoryActivity, 模型)

recyclerView.adapter = orderAdapter

© www.soinside.com 2019 - 2024. All rights reserved.