recyclerview 滑动到当前_RecyclerView滚动到指定位置的一种姿势。

其实这个问题没有什么难度了,下面的两种方式都可以实现,但是效果可能并不是我想要的。

recyclerView.scrollToPosition(position);

recyclerView.smoothScrollToPosition(position);

因为我的效果是想要指定的position滑动到窗口最顶部,但实际效果却不是这样的。

百度

老规度,借助一下性无能的百度。

答案出来了:

/**

* RecyclerView 移动到当前位置,

*

* @param manager 设置RecyclerView对应的manager

* @param n 要跳转的位置

*/

public static void MoveToPosition(LinearLayoutManager manager, int n) {

manager.scrollToPositionWithOffset(n, 0);

manager.setStackFromEnd(true);

}

也有这样的:

final LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();

int fir = manager.findFirstVisibleItemPosition();

int end = manager.findLastVisibleItemPosition();

final int p = Integer.parseInt(string);

if (p <= fir) {

recyclerView.scrollToPosition(p);

} else if (p <= end) {

int top = recyclerView.getChildAt(p - fir).getTop();

recyclerView.scrollBy(0, top);

} else {

recyclerView.scrollToPosition(p); //先让当前view滚动到列表内

move = true;

}

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener()

{

@Override

public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

super.onScrolled(recyclerView, dx, dy);

if (move) {

move = false;

int n = p - manager.findFirstVisibleItemPosition();

if (n >= 0 && n < recyclerView.getChildCount()) {

recyclerView.scrollBy(0, recyclerView.getChildAt(n).getTop()); //滚动到顶部

}

}

}

});

这个代码很多了,看看脑袋都大喽。

我的方法

LinearSmoothScroller smoothScroller = new LinearSmoothScroller(this){

@Override

protected int getVerticalSnapPreference() {

return LinearSmoothScroller.SNAP_TO_START;

}

};

recyclerView.getLayoutManager().startSmoothScroll(smoothScroller);

关键在于 getVerticalSnapPreference()的返回值,共有三种:

public static final int SNAP_TO_START = -1;

public static final int SNAP_TO_END = 1;

public static final int SNAP_TO_ANY = 0;

SNAP_TO_START使子视图的左侧或顶部与父视图的左侧或顶部对齐。

SNAP_TO_END使子视图的右侧或底部与父视图的右侧面或底部对齐。

SNAP_TO_ANY根据子视图的当前位置与父布局的关系,决定子视图是否从头到尾跟随。

比如,如果子视图实际位于RecyclerView的左侧,SNAP_TO_ANY和SNAP_TO_START是没有

差别的。

默认值就是SNAP_TO_ANY啦。

具体什么效果大家可以试试啦,本文只是抛砖引玉。

结束,谢谢~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值