【问题标题】:Paging Library recyclerview does not display updated data (DB + Network)Paging Library recyclerview 不显示更新数据(DB + Network)
【发布时间】:2020-02-04 04:39:17
【问题描述】:

我有一个要使用分页库显示的人员列表,从本地数据库加载初始数据,一旦需要更多数据,我调用 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)
      })
   }
}

我的视图模型:

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)

   }
}

直到这里一切都好(获取的数据保存到数据库中),但是recyclerview不会用新数据更新列表,而是只显示初始数据

我已经搜索过这个主题并对其进行了调整,但到目前为止找不到为什么不适合我。

【问题讨论】:

  • 你可能想参考本教程的示例实现,记得用 androidx.paging... 包(jetpack)替换 android.arch.paging...(已弃用)。希望这可以帮助 ! medium.com/@harunwangereka/…
  • 谢谢,会查的

标签: android kotlin android-recyclerview android-paging-library


【解决方案1】:

抱歉,回复晚了,但很忙。我在 Android 的页面DataSource(已弃用)中找到了非常明确的答案:

"一个 PagedList / DataSource 对是数据集的快照。一个新的 如果发生更新,则必须创建一对 PagedList / DataSource, 例如发生重新排序、插入、删除或内容更新。一种 DataSource 必须检测到它不能继续加载它的快照 (例如,当数据库查询发现表无效时), 并调用 invalidate()。然后一个新的 PagedList / DataSource 对将是 创建以从数据库查询的新状态加载数据。”

因此,一旦通过向下滑动列表调用刷新,我的数据就会更新。

【讨论】:

    猜你喜欢
    • 2019-08-02
    • 1970-01-01
    • 2020-05-26
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多