У меня есть список лиц, которые нужно показать с помощью библиотеки подкачки, загрузить исходные данные из локальной БД, и как только потребуется больше данных, я вызываю API для получения с сервера и сохранения его в БД.
Мой фрагмент:
Class PersonListFragment: Fragment(){
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recycler_view.layoutManager = LinearLayoutManager(context)
recycler_view.adapter = personListAdapter
personListViewModel.getPersonsLiveData().observe(viewLifecycleOwner, Observer {
personListAdapter.submitList(it)
})
}
}
Моя ViewModel:
class PersonViewModel: ViewModel{
lateinit var personsLiveData: LiveData<PagedList<Person>>
lateinit var boundaryCallback: TransactionBoundaryCallback
fun getPersonsLiveData(): LiveData<PagedList<Person>> = personsLiveData
Init {
val dataSourceFactory = getPersons()
val config = PagedList.Config.Builder()
.setEnablePlaceholders(false)
.setPageSize(10)
.build()
boundaryCallback = PersonBoundaryCallback()
personsLiveData = LivePagedListBuilder(dataSourceFactory, config)
.setBoundaryCallback(boundaryCallback)
.build()
}
private fun getPersons(): DataSource.Factory<Int, Persons> = personDAO.getAllPersons()
}
Адаптер списка:
class PersonListAdapter: PagedListAdapter<Person, PersonListAdapter.PersonViewHolder>(DIFF_CALLBACK) {
...
companion object {
val DIFF_CALLBACK: DiffUtil.ItemCallback<Person> = object : DiffUtil.ItemCallback<Person>() {
override fun areItemsTheSame(oldItem: Person, newItem: Person): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: Person, newItem: Person): Boolean {
return oldItem == newItem
}
}
}
}
Дао:
@Dao
interface PersonDAO {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(persons: List<Person>): Completable
@androidx.room.Persons
@Query("Select * from person_table")
fun getAllPersons(): DataSource.Factory<Int, Person>
}
Класс обратного вызова:
class PersonBoundaryCallback: PagedList.BoundaryCallback<Person>(){
override fun onZeroItemsLoaded() {
requestAndSave()
super.onZeroItemsLoaded()
}
override fun onItemAtEndLoaded(itemAtEnd: Person) {
...
//request data from API and saves it into DB
requestAndSave()
super.onItemAtEndLoaded(itemAtEnd)
}
}
Пока все не будет в порядке (извлеченные данные сохраняются в БД), но просмотрщик не обновляет список новыми данными, вместо этого он продолжает отображать только начальный
Я искал об этом topi c и адаптировал его к нему, но пока не могу найти, почему он не работает для меня.