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

    }

});

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容