RecyclerView滑动到指定位置,并指定位置在顶部

一般我们用 mRecycleview.smoothScrollToPosition(0)滑动到顶部,具有滚动效果,但是如果我们想滚动到任意指定位置,那么smoothScrollToPosition()就不能保证所指定item位于屏幕顶部,那么一下提供下我解决的方法:

1.第一种方法

此方法能实现指定位置位于屏幕顶部,但是不具有平滑滚动视觉效果:

 if (position != -1) {mRecycleview.scrollToPosition(position);LinearLayoutManager mLayoutManager =(LinearLayoutManager) mRecycleview.getLayoutManager();mLayoutManager.scrollToPositionWithOffset(position, 0);}

2.第二种方法

此方法能实现指定位置位于屏幕顶部,具有平滑滚动视觉效果:

首先获取第一个可见位置和最后一个可见位置,分三种情况:

1.如果如果跳转位置在第一个可见位置之前,就smoothScrollToPosition()可以直接跳转;
2.如果跳转位置在第一个可见项之后,最后一个可见项之前smoothScrollToPosition()不会滚动,此时调用smoothScrollBy来滑动到指定位置;
3.如果要跳转的位置在最后可见项之后,则先调用smoothScrollToPosition()将要跳转的位置滚动到可见位置,在addOnScrollListener()里通过onScrollStateChanged控制,调用smoothMoveToPosition,再次执行判断;

 //目标项是否在最后一个可见项之后private boolean mShouldScroll;//记录目标项位置private int mToPosition;/*** 滑动到指定位置*/private void smoothMoveToPosition(RecyclerView mRecyclerView, final int position) {// 第一个可见位置int firstItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(0));// 最后一个可见位置int lastItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(mRecyclerView.getChildCount() - 1));if (position < firstItem) {// 第一种可能:跳转位置在第一个可见位置之前mRecyclerView.smoothScrollToPosition(position);} else if (position <= lastItem) {// 第二种可能:跳转位置在第一个可见位置之后int movePosition = position - firstItem;if (movePosition >= 0 && movePosition < mRecyclerView.getChildCount()) {int top = mRecyclerView.getChildAt(movePosition).getTop();mRecyclerView.smoothScrollBy(0, top);}} else {// 第三种可能:跳转位置在最后可见项之后mRecyclerView.smoothScrollToPosition(position);mToPosition = position;mShouldScroll = true;}}
 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);if (mShouldScroll&& RecyclerView.SCROLL_STATE_IDLE == newState) {mShouldScroll = false;smoothMoveToPosition(irc, mToPosition);}}});
if (position != -1) {smoothMoveToPosition(irc,position);}else {smoothMoveToPosition(irc,position+1);}

Ok了,这样就可以实现了;


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部