如何获取 RecyclerView 的滑动距离?
关注者
65被浏览
86,38313 个回答
我遇到了同样的问题,
使用
kmshack/Android-ParallaxHeaderViewPager · GitHub的时候,我想将其中的listview或者gridView换成RecyclerView,但是遇到一个方法不知道怎么转换
public int getScrollY(AbsListView view) {
View c = view.getChildAt(0);
if (c == null) {
return 0;
}
int firstVisiblePosition = view.getFirstVisiblePosition();
int top = c.getTop();
int headerHeight = 0;
if (firstVisiblePosition >= 1) {
headerHeight = 280;
}
return -top + firstVisiblePosition * c.getHeight() + headerHeight;
}
怎样真正的计算出top值?
我也遇到了同样的问题,经过各种折腾总算是勉强算出来了,只是实现方式有点别扭,代码放出来,还请大神多多指点。
import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
public class MyLinearLayoutManager extends LinearLayoutManager {
private RecyclerView.Recycler mRecycler;
public MyLinearLayoutManager(Context context) {
super(context);
}
@Override
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) {
super.onMeasure(recycler, state, widthSpec, heightSpec);
mRecycler = recycler;
}
public int getScrollY() {
int scrollY = getPaddingTop();
int firstVisibleItemPosition = findFirstVisibleItemPosition();
if (firstVisibleItemPosition >= 0 && firstVisibleItemPosition < getItemCount()) {
for (int i = 0; i < firstVisibleItemPosition; i++) {
View view = mRecycler.getViewForPosition(i);
if (view == null) {
continue;
}
if (view.getMeasuredHeight() <= 0) {
measureChildWithMargins(view, 0, 0);
}
RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) view.getLayoutParams();
scrollY += lp.topMargin;
scrollY += getDecoratedMeasuredHeight(view);
scrollY += lp.bottomMargin;
mRecycler.recycleView(view);
}
View firstVisibleItem = findViewByPosition(firstVisibleItemPosition);
RecyclerView.LayoutParams firstVisibleItemLayoutParams = (RecyclerView.LayoutParams) firstVisibleItem.getLayoutParams();
scrollY += firstVisibleItemLayoutParams.topMargin;
scrollY -= getDecoratedTop(firstVisibleItem);
}
return scrollY;
}
}