Android RrecyclerView条目跳转到指定位置
效果图如下:侧滑点击第几张 主界面显示第几章
工具类:
public class MoveToPosition {
//目标项是否在最后一个可见项之后
private static boolean mShouldScroll;
//记录目标项位置
private static int mToPosition;
/**
* RecyclerView 移动到当前位置, 不带动画效果
* @param manager 设置RecyclerView对应的manager
* @param mRecyclerView 当前的RecyclerView
* @param n 要跳转的位置
*/
public static void MoveToPosition(LinearLayoutManager manager, RecyclerView mRecyclerView, int n) {
int firstItem = manager.findFirstVisibleItemPosition();
int lastItem = manager.findLastVisibleItemPosition();
if (n <= firstItem) {
mRecyclerView.scrollToPosition(n);
}else if (n <= lastItem) {
int top = mRecyclerView.getChildAt(n - firstItem).getTop();
mRecyclerView.scrollBy(0, top);
}else {
// mRecyclerView.scrollToPosition(n);
manager.scrollToPositionWithOffset(n,0);
}
}
/**
* 滑动到指定位置 带动画效果
*/
public static void smoothMoveToPosition(LinearLayoutManager manager, 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.scrollToPosition(position);
}else if (position <= lastItem) {
// 第二种可能:跳转位置在第一个可见位置之后
int movePosition = position - firstItem;
if (movePosition >=0 && movePosition < mRecyclerView.getChildCount()) {
int top = mRecyclerView.getChildAt(movePosition).getTop();
mRecyclerView.scrollBy(0, top);
}
}else {
// 第三种可能:跳转位置在最后可见项之后
// mRecyclerView.smoothScrollToPosition(position);
// mToPosition = position;
// mShouldScroll = true;
// mRecyclerView.scrollToPosition(position);
manager.scrollToPositionWithOffset(position,0);
mToPosition = position;
mShouldScroll =true;
}
}
}
调用方法:
titleAdapter.setOnItemClickLitener(new TitleAdapter1.OnItemClickLitener() {
@Override
public void onItemClick(View view, int position) {
drawerlayout.closeDrawers();
MoveToPosition.smoothMoveToPosition(ContentLinearLayoutManager, recyclerView, position);
}
});
上一篇下一篇