欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android RecyclerView如何获得当前滑动的位置?

程序员文章站 2022-03-16 16:45:28
Android本身并没有提供直接获得RecyclerView具体位置的api,layoutManager.findFirstCompletelyVisibleItemPositio...

Android本身并没有提供直接获得RecyclerView具体位置的api,layoutManager.findFirstCompletelyVisibleItemPosition(); 只是获得第一个可见的,

因为layoutManager.scrollToPositionWithOffset() 参数有一个是offset,这个值,Android没有直接提供,

阅读了安卓源码之后(基于android 6.0)总结出了下面的方案可以获得获得RecyclerView滑动的位置,目前在5.0和6.0上测试时OK的,在7.0未测试

这种使用场景并不多,一般activity或者fragment都会有系统记录状态位置,但是例如文件管理器,返回上一级目录没有必要使用多个fragment或者activity,

那么记录最后的位置就显得尤为重要了

//获得RecyclerView滑动的位置

private int[] getRecyclerViewLastPosition(LinearLayoutManager layoutManager) {

int[] pos = new int[2];

pos[0] = layoutManager.findFirstCompletelyVisibleItemPosition();

OrientationHelper orientationHelper = OrientationHelper.createOrientationHelper(layoutManager, OrientationHelper.VERTICAL);

int fromIndex = 0;

int toIndex = itemBeanList.size();

final int start = orientationHelper.getStartAfterPadding();

final int end = orientationHelper.getEndAfterPadding();

final int next = toIndex > fromIndex 1 : -1;

for (int i = fromIndex; i != toIndex; i += next) {

final View child = mRv.getChildAt(i);

final int childStart = orientationHelper.getDecoratedStart(child);

final int childEnd = orientationHelper.getDecoratedEnd(child);

if (childStart < end && childEnd > start) {

if (childStart >= start && childEnd <= end) {

pos[1] = childStart;

LogUtils.v("position = " + pos[0] + " off = " + pos[1]);

return pos;

}

}

}

return pos;

}

//重新设置RecyclerView的位置

int []pos = getRecyclerViewLastPosition(layoutManager);

layoutManager.scrollToPositionWithOffset(pos[0],pos[1]);

//记得刷新下数据

Adapter.notifyDataSetChanged()