RecyclerView滚动到页面底部不会触发.addOnScrollListener的canScrollVertically

时间:2020-02-21 17:14:23

标签: android android-recyclerview

我正在尝试在我的垂直recyclerview中实现跳过功能。当用户单击按钮时,recyclerView将一直滚动到底部并触发API调用。现在要检查用户是否在屏幕底部,我在自己的recyclerview中使用.addOnScrollListener

mGridRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);

                //SCROLL_STATE_IDE prevents repeated calls from happening
                // when near bottom of screen and slightly scroll up a bit
                if(!mGridRecycler.canScrollVertically(1) && newState==RecyclerView.SCROLL_STATE_IDLE){
                    Log.d(TAG, "onScrollStateChanged: CALLED WTF");
                    mActivity.getNextPageGridView();
                }
            }
        });

为了实现到最后一项的跳过功能,我在按钮上使用了此方法:

mGridRecycler.scrollToPosition(mList.size() - 1);

它跳到最后一项,但是未调用if-statement,因此未触发API调用。有人知道我可以使它成功工作吗?

4 个答案:

答案 0 :(得分:2)

RecyclerView不知道LayoutManager如何处理滚动。
如果在布局后 first last 子位置发生变化,您只会接到onScrolled的电话,您不会得到onScrollStateChanged回调。

您应该做什么?

或者,您可以使用smoothScrollToPosition(..)方法,覆盖onScrolled方法, OR 之后向您的API发出请求跳过按钮单击,这是适合您的情况的最佳解决方案。

答案 1 :(得分:0)

如果您的内容版式具有顶部空白或项目视图具有空白,则不会滚动到布局的末尾。我记不清了,但尝试删除itemviewcontentview的所有边距。我通过一点技巧解决了这个问题,在项目的前面的LinearLayout的末尾添加了一个空视图。希望它对您有用。

答案 2 :(得分:0)

Recylerview滚动非常快,因此请尝试使用处理程序来延迟1秒,或者也可以使用

recyclerView.post(() -> mGridRecycler.scrollToPosition(mList.size() - 1);

答案 3 :(得分:0)

为了正确实现自动平滑滚动,您需要执行以下操作:

声明滚动速度常数:

companion object {
    const val SMOOTH_SCROLL_SPEED = 100f
}

创建一个全局SmoothScroller参数:

private lateinit var smoothScroller: SmoothScroller

在您的init方法中:初始化SmoothScroller对象:

smoothScroller = object : LinearSmoothScroller(context) {
    override fun getVerticalSnapPreference(): Int {
        return SNAP_TO_START
    }

    override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics?): Float {
        displayMetrics?.let {
            return SMOOTH_SCROLL_SPEED / it.densityDpi
        }
        return super.calculateSpeedPerPixel(displayMetrics)
    }
}

创建此方法并在您希望平滑滚动到列表中的任何位置时调用它:

open fun smoothScroll(position: Int) {
    smoothScroller.targetPosition = position
    yourRecycleView.layoutManager.startSmoothScroll(smoothScroller)
}

希望有帮助。