В окне перезаписи библиотеки подкачки не отображаются обновленные данные (БД + сеть) - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть список лиц, которые нужно показать с помощью библиотеки подкачки, загрузить исходные данные из локальной БД, и как только потребуется больше данных, я вызываю 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 и адаптировал его к нему, но пока не могу найти, почему он не работает для меня.

1 Ответ

0 голосов
/ 09 марта 2020

Извините, что отвечаю поздно, но занялся. Я нашел ответ очень ясным на странице Android DataSource (устарело):

"Пара PagedList / DataSource представляет собой снимок набора данных. Новая пара PagedList / DataSource должен быть создан, если происходит обновление, такое как изменение порядка, вставки, удаления или обновления содержимого. DataSource должен обнаружить, что он не может продолжить загрузку своего снимка (например, когда запрос базы данных обнаруживает, что таблица признана недействительной) и вызовите invalidate (). Затем будет создана новая пара PagedList / DataSource для загрузки данных из нового состояния запроса к базе данных. "

Поэтому мои данные обновляются после обновления sh вызывается с помощью списка вниз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...