我的问题是,我们可以从
RecyclerView
方法中调用 onScrolled()
的 onScrollStateChanged()
方法吗?原因是我想检查两个条件。如果 SCROLL_STATE_SETTLING
为 true,则检查用户是否已向下滚动。还有其他方法可以检查两者吗?
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_SETTLING) {
// Now I have to check if the user has scrolled down or up.
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
这是你想要的吗?
从
onScrolled
方法中,您可以通过检查 dy
是否小于 0 来设置布尔标志“isScrolledDown”,以了解用户向下滚动。然后每当滚动状态为 SCROLL_STATE_SETTLING
并且 isScrolledDown
为 true 时,就执行你想要的操作。
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
private boolean isScrolledDown = false;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_SETTLING && isScrolledDown) {
// Do something...
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
isScrolledDown = dy < 0;
}
});
您可以首先在侦听器外部声明这两个变量
//chose appropriate initial values
var updatedRange = Range(...)
var lastVisibilityRange = Range(...)
然后在监听器回调中你会看到这样的内容:
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
val first = manager.findFirstVisibleItemPosition()
val last = manager.findLastVisibleItemPosition()
lastVisibilityRange = updatedRange
updatedRange = Range(first , last)
//or you can even call this section in onScrollStateChanged
if (updatedRange.lower <= lastVisibilityRange.lower) {
//has scrolled up
} else {
//has scrolled down
}
}
代码尚未经过测试,您可以通过在其中添加
LiveData
来使其更具反应性,如果这不是您想要的,请随时告诉我,希望这会有所帮助或为您指出方向正确,祝大家有美好的一天。