Android RrecyclerView条目跳转到指定位置

2020-12-12  本文已影响0人  景小帮

效果图如下:侧滑点击第几张     主界面显示第几章



工具类:

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

    }

});

上一篇下一篇

猜你喜欢

热点阅读