Reputation: 4136
Hello folks I'm trying to handle an onScrolled
event in my recyclerView
, that's inside a NestedScrollView
.
So far, I have found setOnScrollChangeListener
, however this method is API 23, and I'm targeting API 21, any idea to handle this issue back in API 21?
Upvotes: 12
Views: 11611
Reputation: 28875
Thanks to @NhatVM in Kotlin:
scrollView.setOnScrollChangeListener(
NestedScrollView.OnScrollChangeListener { nestedScrollView, scrollX, scrollY, oldScrollX, oldScrollY ->
// ...
}
)
Upvotes: 0
Reputation: 2124
I think you are using setOnChangeScrollListener with View.OnScrollChangeListener. Please use NestedScrollView.OnScrollChangeListener like that:
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");
}
}
});
Upvotes: 26
Reputation: 4136
After some time I got an idea, I've stopped listening to scroll on RecyclerView
and started listening to NestedScrollView
onScroll
event.
I managed to make my loadOnDemand recyclerView
using this snippet
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
is a class property that I change to false when my callback returns from server
Upvotes: 3
Reputation: 350
You can achieve that using ViewTreeObserver#addOnScrollChangedListener() below api 23:
mRecylerview.getViewTreeObserver().addOnScrollChangedListener(
new ViewTreeObserver.OnScrollChangedListener() {
@Override public void onScrollChanged() {
int x = toolbar.getScrollX();
int y = toolbar.getScrollY();
}
});
Upvotes: 3