Android Jetpack Paging 3 下拉刷新和加载更多代码示例
使用Paging3实现列表的下拉刷新和加载更多
首先定义列表布局文件
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
定义PagingSource
class RecordPagingSource : PagingSource<Int,RecordItem>() {
private val lotteryRepository = LotteryRepository()
override fun getRefreshKey(state: PagingState<Int, RecordItem>): Int? {
return null
}
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, RecordItem> {
return try {
val page = params.key ?: 1
val pageSize = params.loadSize
var list = listOf<RecordItem>()
var result: ServiceResult<RecordItem> = repository.recordList(page,pageSize)
delay(1000)
//模拟数据
if(page < 5){
for(index in (page-1)*pageSize .. page * pageSize){
result.data.items.add(RecordItem("2021-11-11 11:11:11",1, "名字$index"))
}
}
if(result.errcode.toInt() == 0){
list = result.data.items
}
var prevKey: Int?
var nextKey: Int?
var initLoadSize = 16
if(page == 1){
prevKey = null
nextKey = initLoadSize/pageSize + 1
}else{
prevKey = page - 1
nextKey = if (result.data.items.size < pageSize) null else page + 1
}
return LoadResult.Page(
data = list,
prevKey = prevKey,
nextKey = nextKey
)
} catch (e: Exception) {
e.printStackTrace()
LoadResult.Error(e)
}
}
}
定义ViewModel
class RecordViewModel : ViewModel() {
fun loadRecordList() : Flow<PagingData<RecordItem>> {
return Pager(
config = PagingConfig(
pageSize = 8,
prefetchDistance = 1,
initialLoadSize = 16
),
pagingSourceFactory = {
RecordPagingSource()
}
).flow
}
}
定义ViewModelFactory
class RecordViewModelFactory : ViewModelProvider.NewInstanceFactory() {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return RecordViewModel() as T
}
}
定义PagingDataAdapter
class RecordPagingDataAdapter(
val activity: RecordActivity
) :PagingDataAdapter<RecordItem, RecordPagingDataAdapter.ViewHolder>(
object:DiffUtil.ItemCallback<RecordItem>(){
override fun areItemsTheSame(oldItem: RecordItem,newItem: RecordItem): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: RecordItem,newItem: RecordItem): Boolean {
return oldItem == newItem
}
}
)
{
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = getItem(position)
item?.let {
holder.nameText.text = item.name
with(holder.itemView) {
tag = item
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemListBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
inner class ViewHolder(binding: ItemListBinding) : RecyclerView.ViewHolder(binding.root) {
val nameText: TextView = binding.nameText
}
}
在Activity中
//view model
recordViewModel = ViewModelProvider(this, RecordViewModelFactory()).get(RecordViewModel::class.java)
// Adapter
//var recyclerViewAdapter = RecordRecyclerViewAdapter(activity as RecordActivity,coinDataList)
//lotteryRecordRecyclerView.adapter = recyclerViewAdapter
var recyclerViewAdapter = RecordPagingDataAdapter(activity as RecordActivity)
binding.apply {
recyclerView.adapter = recyclerViewAdapter.withLoadStateFooter(
LoadMoreAdapter(activity as RecordActivity)
)
recyclerView.layoutManager = LinearLayoutManager(activity)
var loading = false
// 刷新
binding.swipeRefreshLayout.setOnRefreshListener {
recyclerViewAdapter.refresh()
/*lifecycleScope.launch{
recyclerViewAdapter.loadStateFlow.collectLatest { state->
logI(TAG,"setOnRefreshListener:" + state.refresh.toString())
if (state.refresh !is LoadState.Loading) recyclerViewAdapter.refresh()
}
}*/
}
recyclerViewAdapter.addLoadStateListener {
logI(TAG,"addLoadStateListener:" + it.refresh.toString())
when (it.refresh) {
is LoadState.NotLoading -> {
loading = false
binding.swipeRefreshLayout.isRefreshing = false
}
is LoadState.Loading -> {
loading = true
}
is LoadState.Error -> {
loading = false
binding.swipeRefreshLayout.isRefreshing = false
}
}
}
}
// 加载数据
lifecycleScope.launchWhenCreated {
recordViewModel.loadRecordList().collectLatest {
recyclerViewAdapter.submitData(it)
}
}
以上
本站内容来源于作者发布和网络转载,如有版权相关问题请及时与我们取得联系,我们将立即删除。