[英]Android recyclerview doesn't observe data immediately until I refresh or observe using handler after short time
在我刷新或使用Handler
並在短時間內(最多 3 秒)重新Observe
之前,recyclerview 不會Observe
數據。 否則它只顯示一個白屏(空布局)。
請注意,我確信 recyclerview 和 api 都可以正常工作,因為如果我放置處理程序,我會確保顯示數據,但只能以這種方式顯示。 而且由於Handler
給出了一個非常糟糕的行為,我想擺脫它並找出問題所在。
代碼:
Api 接口:
interface ProductsApi {
@GET("products")
fun get_products_asc(
): Call<List<Product>>
@GET("products?sort=desc")
fun get_products_desc(
): Call<List<Product>>
}
查看 Model:
var new_collection_list : MutableLiveData<List<Product>>
init{
new_collection_list = MutableLiveData()
}
fun get_new_collection_data() : MutableLiveData<List<Product>>{
Log.d(TAG, "get_new_collection_data Home: Success Response")
var call = api.get_products_desc()
call.enqueue(object : Callback<List<Product>> {
override fun onResponse(call: Call<List<Product>>, response: Response<List<Product>>) {
if (response.body() != null){
new_collection_list.postValue(response.body()!!)
Log.d(TAG, "Home: Success Response")
}
else{
new_collection_list.postValue(null)
Log.d(TAG, "Home: Null Response")
}
}
override fun onFailure(call: Call<List<Product>>, t: Throwable) {
Log.d(TAG, "Home: Failure Response")
}
})
return new_collection_list
}
分段:
viewModel.get_new_collection_data().observe(viewLifecycleOwner, Observer {
new_collections_adapter.submitList(it)
new_collections_adapter.notifyDataSetChanged()
})
我試圖解決這個問題已經有好幾天了,將不勝感激。 謝謝。
編輯:我已經更新了代碼以匹配仍然無法正常工作的答案。
代碼:
查看 Model:
var new_collection_list : MutableLiveData<List<Product>>
init{
new_collection_list = MutableLiveData()
get_new_collection_data()
}
fun get_new_collection_data() {
Log.d(TAG, "get_new_collection_data Home: Success Response")
var call = api.get_products_desc()
call.enqueue(object : Callback<List<Product>> {
override fun onResponse(call: Call<List<Product>>, response: Response<List<Product>>) {
if (response.body() != null){
new_collection_list.postValue(response.body()!!)
Log.d(TAG, "Home: Success Response")
}
else{
new_collection_list.postValue(null)
Log.d(TAG, "Home: Null Response")
}
}
override fun onFailure(call: Call<List<Product>>, t: Throwable) {
Log.d(TAG, "Home: Failure Response")
}
})
}
分段:
viewModel.get_new_collection_data()
viewModel.new_collection_list.observe(viewLifecycleOwner, Observer {
new_collections_adapter.submitList(it)
new_collections_adapter.notifyDataSetChanged()
})
您可以像下面的代碼一樣直接觀察實時數據,而不是使用 function。 由於實時數據是生命周期感知的,它會在每次代碼更改時觸發。 還要添加一個觀察視圖 model function ,其中包含代碼,並在片段的 OnCreateView 中調用一次,以確保安全。
viewModel.new_collection_list.observe(
this,
Observer { getList->
new_collection_list.let {
new_collections_adapter.submitList(it)
new_collections_adapter.notifyDataSetChanged()
}
}
)
問題出在您的 viewModel 中,因為您正在調用 API 進入后台線程並允許return new_collection_list立即返回而無需等待結果。
解決方案是:您可以在 ViewModel 更新時直接觀察 liveData
步驟1。 在 ViewModel 中:-
fun get_new_collection_data(){
Log.d(TAG, "get_new_collection_data Home: Success Response")
var call = api.get_products_desc()
call.enqueue(object : Callback<List<Product>> {
override fun onResponse(call: Call<List<Product>>, response: Response<List<Product>>) {
if (response.body() != null){
new_collection_list.postValue(response.body()!!)
Log.d(TAG, "Home: Success Response")
}
else{
new_collection_list.postValue(null)
Log.d(TAG, "Home: Null Response")
}
}
override fun onFailure(call: Call<List<Product>>, t: Throwable) {
Log.d(TAG, "Home: Failure Response")
}
})
}
第2步。 在片段->
viewModel.get_new_collection_data()
viewModel.new_collection_list.observe(viewLifecycleOwner, Observer {
new_collections_adapter.submitList(it)
new_collections_adapter.notifyDataSetChanged()
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.