【问题标题】:NestedScrollView setOnScrollChangeListener api 21NestedScrollView setOnScrollChangeListener api 21
【发布时间】:2018-09-24 16:50:27
【问题描述】:
大家好,我正在尝试处理 recyclerView 中的 onScrolled 事件,该事件位于 NestedScrollView 中。
到目前为止,我找到了setOnScrollChangeListener,但是这个方法是 API 23,我的目标是 API 21,有什么想法可以在 API 21 中处理这个问题吗?
【问题讨论】:
标签:
android
android-recyclerview
android-nestedscrollview
onscrolllistener
【解决方案1】:
我认为您将 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");
}
}
});
【解决方案2】:
您可以使用 API 23 下面的 ViewTreeObserver#addOnScrollChangedListener() 来实现:
mRecylerview.getViewTreeObserver().addOnScrollChangedListener(
new ViewTreeObserver.OnScrollChangedListener() {
@Override public void onScrollChanged() {
int x = toolbar.getScrollX();
int y = toolbar.getScrollY();
}
});
【解决方案3】:
一段时间后我有了一个想法,我已经停止在RecyclerView 上收听滚动并开始收听NestedScrollView onScroll 事件。
我设法使用这个 sn-p 使我的 loadOnDemand 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
【解决方案4】:
感谢 Kotlin 中的@NhatVM:
scrollView.setOnScrollChangeListener(
NestedScrollView.OnScrollChangeListener { nestedScrollView, scrollX, scrollY, oldScrollX, oldScrollY ->
// ...
}
)