【问题标题】:Android recyclerview doesn't observe data immediately until I refresh or observe using handler after short timeAndroid recyclerview 不会立即观察数据,直到我在短时间内刷新或观察使用处理程序
【发布时间】:2021-07-30 07:00:25
【问题描述】:

直到我在短时间内(最多 3 秒)刷新或使用 Handler 和重新 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>>


}

查看模型:

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()
        })

我已经尝试解决这个问题好几天了,如果有任何帮助,我将不胜感激。谢谢。

编辑:我已更新代码以匹配仍然无法正常工作的答案。

代码:

查看模型:

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()
})

【问题讨论】:

    标签: android android-recyclerview retrofit


    【解决方案1】:

    您可以像下面的代码一样直接观察实时数据,而不是使用函数。由于实时数据是生命周期感知的,它会在每次代码更改时触发。 还要添加一个带有代码的观察视图模型函数,并在片段的 OnCreateView 中调用一次,以确保安全。

    viewModel.new_collection_list.observe(
                this,
                Observer { getList->
                    new_collection_list.let {
                        new_collections_adapter.submitList(it)
                new_collections_adapter.notifyDataSetChanged()
                    }
                }
            )
    

    【讨论】:

    • 发布更新。更新代码以匹配这个答案仍然没有加载数据,直到我再次使用 Observe 再次使用 Handler
    【解决方案2】:

    问题出在您的 viewModel 中,因为您正在调用进入后台线程并允许 return new_collection_list 立即返回而无需等待结果的 API。

    解决方案是:您可以在 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()
        })
    

    【讨论】:

    • 发布更新。更新代码以匹配这个答案仍然没有加载数据,直到我再次使用 Observe 再次使用 Handler
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    相关资源
    最近更新 更多