int findFirstVisibleItemPosition();
int findFirstCompletelyVisibleItemPosition();
int findLastVisibleItemPosition();
int findLastCompletelyVisibleItemPosition();
Override the ScrollChangedListener of recyclerview and add below code in onScollerdChanged, to get the visibility of your row.
if (rvPercentage != null){
LinearLayoutManager layoutManager = ((LinearLayoutManager) rvPercentage.getLayoutManager());
final int firstPosition = layoutManager.findFirstVisibleItemPosition();
final int lastPosition = layoutManager.findLastVisibleItemPosition();
Rect rvRect = new Rect();
rvPercentage.getGlobalVisibleRect(rvRect);
for (int i = firstPosition; i <= lastPosition; i++) {
Rect rowRect = new Rect();
layoutManager.findViewByPosition(i).getGlobalVisibleRect(rowRect);
int percentFirst;
if (rowRect.bottom >= rvRect.bottom){
int visibleHeightFirst =rvRect.bottom - rowRect.top;
percentFirst = (visibleHeightFirst * 100) / layoutManager.findViewByPosition(i).getHeight();
}else {
int visibleHeightFirst = rowRect.bottom - rvRect.top;
percentFirst = (visibleHeightFirst * 100) / layoutManager.findViewByPosition(i).getHeight();
}
if (percentFirst>100)
percentFirst = 100;
mData.get(i).setPercentage(percentFirst);
mAdapter.notifyItemChanged(i);
}
}
It gives you below output: