大家好,我正在尝试处理位于嵌套滚动视图(NestedScrollView)内的RecyclerView的onScrolled事件。
到目前为止,我已经找到了setOnScrollChangeListener方法,但是这种方法需要API 23,而我正在针对API 21,有什么办法可以解决这个问题吗?
到目前为止,我已经找到了setOnScrollChangeListener方法,但是这种方法需要API 23,而我正在针对API 21,有什么办法可以解决这个问题吗?
我认为您正在使用setOnChangeScrollListener与View.OnScrollChangeListener。请改用NestedScrollView.OnScrollChangeListener,如下所示:
scvProduct.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView nestedScrollView,int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
Log.e("ProductFragment","position button " + topPositionButton + " scrollY " + scrollY);
if(scrollY > oldScrollY){
Log.e("ProductFragment","down");
}
else{
Log.e("ProductFragment","up");
}
}
});
mRecylerview.getViewTreeObserver().addOnScrollChangedListener(
new ViewTreeObserver.OnScrollChangedListener() {
@Override public void onScrollChanged() {
int x = toolbar.getScrollX();
int y = toolbar.getScrollY();
}
});
经过一段时间的思考,我想到了一个主意,停止监听RecyclerView
上的滚动事件,开始监听NestedScrollView
上的onScroll
事件。
使用以下代码片段,我成功地实现了我的recyclerView
的按需加载功能。
nsv_posts_timeline.setOnScrollChangeListener(
NestedScrollView.OnScrollChangeListener {
_, scrollX, scrollY, _, oldScrollY ->
if(scrollY > oldScrollY){
val totalItens = timelineAdapter.itemCount
val currentView = rv_timeline.findChildViewUnder(scrollX.toFloat(), scrollY.toFloat())
val childPosition = rv_timeline.getChildAdapterPosition(currentView)
if((totalItens/2) - (stepSize/2) <= childPosition && !isLoading){
isLoading = true
//skip , take
timelinePresenter.loadMore(totalItens, 5)
}
}
})
isLoading
是一个类属性,当我的回调函数从服务器返回时我会将其改为 false。
感谢 Kotlin 中的 @NhatVM:
scrollView.setOnScrollChangeListener(
NestedScrollView.OnScrollChangeListener { nestedScrollView, scrollX, scrollY, oldScrollX, oldScrollY ->
// ...
}
)