如何获取 RecyclerView 的滑动距离?

我需要根据该距离是否大于/小于某个数值来设置 View 的 translation 和 alpha,目前我的代码如下: mRecyclerView.a…
关注者
65
被浏览
86,383

13 个回答

我遇到了同样的问题,

使用

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;
    }
}