最近遇到需求,要计算RecyclerView滑动距离,用提供的computeVerticalScrollOffset()方法得到的值不是很准确。是基于item的平均高度算得,如果列表中item高度一致可以用此方法。问题来了,我的应用场景是各item高度不一,这时就只能另找方法了。
简单粗暴,直接上代码:
public class OffSetLinearLayoutManager extends LinearLayoutManager {
public OffSetLinearLayoutManager(Context context) {
super(context);
}
private Map<Integer, Integer> heightMap = new HashMap<>();
@Override
public void onLayoutCompleted(RecyclerView.State state) {
super.onLayoutCompleted(state);
int count = getChildCount();
for (int i = 0; i < count; i++) {
View view = getChildAt(i);
if (view != null) {
heightMap.put(getPosition(view), view.getHeight());
}
}
}
public int computeVerticalScrollOffsetExact() {
if (getChildCount() == 0) {
return 0;
}
try {
int firstVisiablePosition = findFirstVisibleItemPosition();
if (firstVisiablePosition == -1) {
return 0;
}
View firstVisiableView = findViewByPosition(firstVisiablePosition);
int offsetY = -(int) (firstVisiableView.getY());
for (int i = 0; i < firstVisiablePosition; i++) {
offsetY += heightMap.get(i) == null ? 0 : heightMap.get(i);
}
return offsetY;
} catch (Exception e) {
return 0;
}
}
}