jetpack ページング ライブラリを実装したい。
APIからの応答を取得した後(Retrofit2とコルーチンを使用)、AndroidページングコールバックがonResultインターフェースを呼び出しているため、すべてが機能しているようです。
ただし、データを受信したときに、メインアクティビティの livedata に値を返していません。
解決策は何ですか?
ビューモデル
fun getListData(): LiveData<PagedList<DataListModel>> {
return initializedPagedListBuilder(PagingConfig.config).build()
}
private fun initializedPagedListBuilder(config: PagedList.Config): LivePagedListBuilder<Int, DataListModel> {
val dataSourceFactory = object : DataSource.Factory<Int, DataListModel>() {
override fun create(): DataSource<Int, DataListModel> {
return ListDataPageSource()
}
}
return LivePagedListBuilder<Int, DataListModel>(dataSourceFactory, config)
}
ListDataPageSource
class ListDataPageSource : PageKeyedDataSource<Int, DataListModel>() {
override fun loadInitial(
params: LoadInitialParams<Int>,
callback: LoadInitialCallback<Int, DataListModel>
) {
val apiCall = RetrofitApi.getApiList("http://jsonplaceholder.typicode.com/").create(
MoviesApi::class.java
)
CoroutineScope(Dispatchers.IO).launch {
val response = apiCall.getDataList(params.requestedLoadSize, 10)
if (response.isSuccessful && response.body() != null) {
callback.onResult(response.body()!!, null, 1)
}
}
}
override fun loadAfter(
params: LoadParams<Int>,
callback: LoadCallback<Int, DataListModel>
) {
val apiCall =
RetrofitApi.getApiList("http://jsonplaceholder.typicode.com/").create(MoviesApi::class.java)
CoroutineScope(Dispatchers.IO).launch {
val response = apiCall.getDataList(params.key + 10, 10)
if (response.isSuccessful && response.body() != null) {
callback.onResult(response.body()!!, params.key)
}
}
}
override fun loadBefore(
params: LoadParams<Int>,
callback: LoadCallback<Int, DataListModel>
) {
}
主な活動
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val adapter = ListDataAdapter()
MainRecyclerView.adapter = adapter
val viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
val liveData = viewModel.getListData()
liveData.observe(this, Observer {
adapter.submitList(it)
})
}
ページング構成
companion object{
val config = PagedList.Config.Builder()
.setPageSize(10)
.setInitialLoadSizeHint(10)
.setEnablePlaceholders(false)
.build()
}