我正在尝试进行 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")
}
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