问题描述
我正在尝试学习 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 (将#修改为@)