PagedListAdapter
是 Android Jetpack 中的一个组件,主要用于实现分页加载列表数据。它继承自 ListAdapter
,而 ListAdapter
又继承自 RecyclerView.Adapter
。PagedListAdapter
主要用于处理分页数据,例如从网络或数据库中逐步加载数据。
PagedListAdapter
本身不对数组项进行排序。它的主要职责是处理分页数据的加载和显示。如果你需要对数据进行排序,可以在数据源层面进行处理,例如在 Room 数据库查询时使用 ORDER BY
子句,或者在将数据传递给 PagedListAdapter
之前手动对数据进行排序。
假设你有一个 User
实体,并且你想按用户名排序:
// Room 数据库查询
@Query("SELECT * FROM user ORDER BY name ASC")
fun getUsersSortedByName(): PagingSource<Int, User>
然后在你的 ViewModel
中使用这个查询:
val userPagingData: LiveData<PagingData<User>> = Pager(
config = PagingConfig(pageSize = 20),
pagingSourceFactory = { database.getUserSortedByName() }
).flow.cachedIn(viewModelScope)
最后,在你的 RecyclerView.Adapter
中使用 PagedListAdapter
:
class UserAdapter : PagedListAdapter<User, UserViewHolder>(UserDiffCallback()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
val inflater = LayoutInflater.from(parent.context)
val binding = ItemUserBinding.inflate(inflater, parent, false)
return UserViewHolder(binding)
}
override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
val user = getItem(position)
user?.let {
holder.bind(it)
}
}
}
class UserDiffCallback : DiffUtil.ItemCallback<User>() {
override fun areItemsTheSame(oldItem: User, newItem: User): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsThe same(oldItem: User, newItem: User): Boolean {
return oldItem == newItem
}
}
通过这种方式,你可以在数据源层面进行排序,然后使用 PagedListAdapter
来高效地显示和处理分页数据。
领取专属 10元无门槛券
手把手带您无忧上云