我正在尝试在我的垂直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调用。有人知道我可以使它成功工作吗?
答案 0 :(得分:2)
RecyclerView不知道LayoutManager如何处理滚动。
如果在布局后 first 和 last 子位置发生变化,您只会接到onScrolled
的电话,您不会得到onScrollStateChanged
回调。
您应该做什么?
或者,您可以使用smoothScrollToPosition(..)
方法,或覆盖onScrolled
方法, OR 在之后向您的API发出请求跳过按钮单击,这是适合您的情况的最佳解决方案。
答案 1 :(得分:0)
如果您的内容版式具有顶部空白或项目视图具有空白,则不会滚动到布局的末尾。我记不清了,但尝试删除itemview
和contentview
的所有边距。我通过一点技巧解决了这个问题,在项目的前面的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)
}
希望有帮助。