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) } }
以上
本站内容来源于作者发布和网络转载,如有版权相关问题请及时与我们取得联系,我们将立即删除。