Skip to content

Instantly share code, notes, and snippets.

@samuel22gj
Last active July 14, 2023 09:09
Show Gist options
  • Save samuel22gj/863ddbfb588f907714bf1c6bb9d75b7f to your computer and use it in GitHub Desktop.
Save samuel22gj/863ddbfb588f907714bf1c6bb9d75b7f to your computer and use it in GitHub Desktop.
A callback listener to notify when item visibility change.
public abstract class OnItemVisibleChangeListener extends RecyclerView.OnScrollListener {
private static final String TAG = OnItemVisibleChangeListener.class.getSimpleName();
private int mFirstVisibleItemPosition = RecyclerView.NO_POSITION;
private int mFirstCompletelyVisibleItemPosition = RecyclerView.NO_POSITION;
private int mLastVisibleItemPosition = RecyclerView.NO_POSITION;
private int mLastCompletelyVisibleItemPosition = RecyclerView.NO_POSITION;
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (recyclerView != null && recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
int firstCompletelyVisibleItemPosition = layoutManager.findFirstCompletelyVisibleItemPosition();
int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
int lastCompletelyVisibleItemPosition = layoutManager.findLastCompletelyVisibleItemPosition();
if (mFirstVisibleItemPosition != firstVisibleItemPosition) {
mFirstVisibleItemPosition = firstVisibleItemPosition;
onFirstVisibleItemChange(recyclerView, mFirstVisibleItemPosition);
}
if (mFirstCompletelyVisibleItemPosition != firstCompletelyVisibleItemPosition) {
mFirstCompletelyVisibleItemPosition = firstCompletelyVisibleItemPosition;
onFirstCompletelyVisibleItemChange(recyclerView, mFirstCompletelyVisibleItemPosition);
}
if (mLastVisibleItemPosition != lastVisibleItemPosition) {
mLastVisibleItemPosition = lastVisibleItemPosition;
onLastVisibleItemChange(recyclerView, mLastVisibleItemPosition);
}
if (mLastCompletelyVisibleItemPosition != lastCompletelyVisibleItemPosition) {
mLastCompletelyVisibleItemPosition = lastCompletelyVisibleItemPosition;
onLastCompletelyVisibleItemChange(recyclerView, mLastCompletelyVisibleItemPosition);
}
}
}
public void onFirstVisibleItemChange(RecyclerView recyclerView, int position) {}
public void onFirstCompletelyVisibleItemChange(RecyclerView recyclerView, int position) {}
public void onLastVisibleItemChange(RecyclerView recyclerView, int position) {}
public void onLastCompletelyVisibleItemChange(RecyclerView recyclerView, int position) {}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment