簡體   English   中英

Android recyclerview 不會立即觀察數據,直到我刷新或在短時間內觀察使用處理程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM