如何检测GridLayout布局的RecyclerView触底并加载更多数据?
问题:RecyclerView滚动到底部加载更多逻辑失效
需求说明
我需要统计RecyclerView显示的条目数量,或者至少能检测到滚动至底部的时机,最终目的是在滚动到列表末尾或接近末尾时加载更多数据(调用REST API)。
当前代码实现
RecyclerView配置代码
binding?.photosGrid?.apply { layoutManager = GridLayoutManager(context, 3) adapter = flickrPhotosAdapter addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { super.onScrollStateChanged(recyclerView, newState) } override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) } }) }
Adapter代码
class FlickrPhotosAdapters(private val viewModel: FlickrViewModel) : ListAdapter<PhotoDetails, FlickrPhotosViewHolder>(PHOTO_COMPARATOR) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FlickrPhotosViewHolder = FlickrPhotosViewHolder.from(parent) override fun onBindViewHolder(holder: FlickrPhotosViewHolder, position: Int) { val item = getItem(position) item?.let { holder.bind(it, viewModel) } } override fun getItemCount(): Int { return super.getItemCount() } companion object { private val PHOTO_COMPARATOR = object : DiffUtil.ItemCallback<PhotoDetails>() { override fun areItemsTheSame( oldItem: PhotoDetails, newItem: PhotoDetails ): Boolean = oldItem == newItem override fun areContentsTheSame( oldItem: PhotoDetails, newItem: PhotoDetails ): Boolean = oldItem == newItem } } }
尝试过的无效方案
我试过5种基于addOnScrollListener(object : RecyclerView.OnScrollListener())的解决方案,均无效,例如下面的Java代码:
@Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); if (!isLoading) { if (linearLayoutManager != null && linearLayoutManager.findLastCompletelyVisibleItemPosition() == rowsArrayList.size() - 1) { //bottom of list! loadMore(); isLoading = true; } } }
整体功能正常,但滚动加载更多的逻辑完全不起作用,现在没有思路了,只需要实现滚动到接近底部或底部时触发加载更多的功能。
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

