LiveData 没有发布 PagedList

问题描述

我正在尝试学习 android jetpack 的分页库。 我找到了 https://medium.com/@sharmadhiraj.np/android-paging-library-step-by-step-implementation-guide-75417753d9b9。为了进行实验,我更新了代码以在按下按钮后开始填充列表:

NewsListActivity.kt:

class NewsListActivity : AppCompatActivity() {

private lateinit var viewmodel: NewsListviewmodel
private lateinit var newslistadapter: Newslistadapter

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_news_list)

    viewmodel = viewmodelProvider(this).get(NewsListviewmodel::class.java)
    initAdapter()
    initState()
}

private fun initAdapter() {
    newslistadapter = Newslistadapter { viewmodel.retry() }
    recycler_view.adapter = newslistadapter
    viewmodel.newsList.observe(this,Observer {
                newslistadapter.submitList(it)
            })
}

private fun initState() {
    load_button.setonClickListener {
        progress_bar.visibility = GONE
        txt_error.visibility = GONE
        viewmodel.retry()
    }
    txt_error.setonClickListener { viewmodel.retry() }
    viewmodel.getState().observe(this,Observer { state ->
        progress_bar.visibility = if (viewmodel.listIsEmpty() && state == LOADING) VISIBLE else GONE
        txt_error.visibility = if (viewmodel.listIsEmpty() && state == ERROR) VISIBLE else GONE
        if (!viewmodel.listIsEmpty()) {
            newslistadapter.setState(state ?: State.DONE)
        }
    })
}
}

activity_news_list.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<androidx.appcompat.widget.AppCompatButton
    android:id="@+id/load_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/load_data"/>

<ProgressBar
    android:id="@+id/progress_bar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true" />

<TextView
    android:id="@+id/txt_error"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="@string/error_message" />

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layoutManager="androidx.recyclerview.widget.linearlayoutmanager"
    android:layout_below="@id/load_button"
    tools:listitem="@layout/item_news" />

</RelativeLayout>

NewsListviewmodel.kt:

    package com.sharmadhiraj.androidpaginglibrarystepbystepimplementationguide.viewmodel

import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.mutablelivedata
import androidx.lifecycle.Transformations
import androidx.lifecycle.viewmodel
import androidx.paging.LivePagedListBuilder
import androidx.paging.PagedList
import com.sharmadhiraj.androidpaginglibrarystepbystepimplementationguide.data.*
import io.reactivex.disposables.Compositedisposable

class NewsListviewmodel : viewmodel() {

    private val networkService = NetworkService.getService()
    var newsList: LiveData<PagedList<News>> = mutablelivedata()
    private val compositedisposable = Compositedisposable()
    private val pageSize = 5
    private val newsDataSourceFactory: NewsDataSourceFactory

    init {
        newsDataSourceFactory = NewsDataSourceFactory(compositedisposable,networkService)
    }


    fun getState(): LiveData<State> = Transformations.switchMap(
            newsDataSourceFactory.newsDataSourceLiveData,NewsDataSource::state
    )

    fun retry() {
        val config = PagedList.Config.Builder()
                .setPageSize(pageSize)
                .setinitialLoadSizeHint(pageSize * 2)
                .setEnablePlaceholders(false)
                .build()
        newsList = LivePagedListBuilder(newsDataSourceFactory,config).build()
        newsDataSourceFactory.newsDataSourceLiveData.value?.retry()
    }

    fun listIsEmpty(): Boolean {
        return newsList.value?.isEmpty() ?: true
    }

    override fun onCleared() {
        super.onCleared()
        compositedisposable.dispose()
    }
}

在 NewsListActivity 中,如果我的新按钮被点击,我会调用重试。在 NewsListviewmodel PagedListBuilder 中,从我的构造函数移到了我的重试函数。如果我点击我的按钮,我的列表不再填充,因为它的观察者不再接收数据。有人可以告诉我点击按钮后获取数据的正确方法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...