为了账号安全,请及时绑定邮箱和手机立即绑定

滚动RecyclerView以在顶部显示所选项目

滚动RecyclerView以在顶部显示所选项目

撒科打诨 2019-10-05 14:50:33
我正在寻找一种滚动A RecyclerView以便在顶部显示所选项目的方法。在A中,ListView我能够通过使用scrollTo(x,y)并获取需要居中的元素的顶部来做到这一点。就像是:@Overridepublic void onItemClick(View v, int pos){    mylistView.scrollTo(0, v.getTop());}问题是RecyclerView使用scrollTo方法说时返回错误RecyclerView不支持滚动到绝对位置如何滚动A RecyclerView将所选项目放在视图顶部?
查看完整描述

3 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

如果您使用LinearLayoutManager或Staggered GridLayoutManager,则它们每个都有一个scrollToPositionWithOffset方法,该方法同时获取位置以及项目开始位置与的开始位置之间的偏移量RecyclerView,这似乎可以满足您的需要(将偏移量设置为0应该与顶部对齐)。


例如:


//Scroll item 2 to 20 pixels from the top

linearLayoutManager.scrollToPositionWithOffset(2, 20);


查看完整回答
反对 回复 2019-10-05
?
慕仙森

TA贡献1827条经验 获得超7个赞

与调速器相同


public class SmoothScrollLinearLayoutManager extends LinearLayoutManager {

private static final float MILLISECONDS_PER_INCH = 110f;

private Context mContext;


public SmoothScrollLinearLayoutManager(Context context,int orientation, boolean reverseLayout) {

    super(context,orientation,reverseLayout);

    mContext = context;

}


@Override

public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,

                                   int position) {

    RecyclerView.SmoothScroller smoothScroller = new TopSnappedSmoothScroller(recyclerView.getContext()){

        //This controls the direction in which smoothScroll looks for your view

        @Override

        public PointF computeScrollVectorForPosition(int targetPosition) {

            return new PointF(0, 1);

        }


        //This returns the milliseconds it takes to scroll one pixel.

        @Override

        protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {

            return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;

        }

    };

    smoothScroller.setTargetPosition(position);

    startSmoothScroll(smoothScroller);

}



private class TopSnappedSmoothScroller extends LinearSmoothScroller {

    public TopSnappedSmoothScroller(Context context) {

        super(context);


    }


    @Override

    public PointF computeScrollVectorForPosition(int targetPosition) {

        return SmoothScrollLinearLayoutManager.this

                .computeScrollVectorForPosition(targetPosition);

    }


    @Override

    protected int getVerticalSnapPreference() {

        return SNAP_TO_START;

    }

}

}


查看完整回答
反对 回复 2019-10-05
  • 3 回答
  • 0 关注
  • 547 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信