Reputation:
I have RecyclerView above that i have an AppBarLayout whose height is larger than 255 px. When user scrolls RecyclerView, AppBarLayout has an fling issue. To avoid that i decided to expand AppBarLayout manually. My RecyclerView made of GridLayoutManager with span of 3. I used below code to listen RecyclerView top reach
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
int firstVisiblePosition = ((LinearLayoutManager)recyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPosition();
if (firstVisiblePosition == 0) {
appBarLayout.setExpanded(true, true);
}
}
}
});
Upvotes: 6
Views: 7860
Reputation: 1244
I found a brilliant solution here. You could implement it inside your
RecyclerView.OnScrollListener
like this:
binding.recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if (!recyclerView.canScrollVertically(-1)) {
Log.d(TAG, "THE TOP")
} else {
Log.d(TAG, "NOT TOP")
}
}
})
Upvotes: 0
Reputation: 191
This answer will help you. Yours truly
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
totalItemCount = layoutManager.getItemCount();
visibleItemCount = layoutManager.getChildCount();
pastVisiblesItems = layoutManager.findFirstVisibleItemPosition();
if ((visibleItemCount + pastVisiblesItems) >= totalItemCount ) {
Log.d(TAG, "scroll down");
}
else{
Log.d(TAG, "scroll up");
}
}
});
Upvotes: 0
Reputation: 307
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int firstVisibleItem = gridLayoutManager.findFirstCompletelyVisibleItemPosition();
if(firstVisibleItem == 0){
// your code
}
}
});
Upvotes: 5