You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:58:17