首页 文章

滚动固定数量的项目/滚动到recyclerview

提问于
浏览
0

我有一个简单的活动,它有一个根布局 . 根布局包含一个recyclerview . Recyclerview将包含从items.xml创建的20个项目,其中包含3个文本视图.Here items.xml表示recyclerview中的单个项目 .

回收者视图可以两种方式滚动,它是1到20之间的项目循环 .

无论滑动/甩动的速度如何,我都要求平滑滚动4个项目 .

我试过很多方法的方法,但到目前为止还没有成功 . 如果有人能提出任何建议,那将非常有帮助 .

  • SnapHelper - 这似乎只捕捉位于中心的项目 .

  • 使用手势检测器 - 检测到所有操作的手势,但我无法阻止recyclerview的默认滚动行为 .

主要问题是由于用户卷轴和褶皱的变化速度而导致的回收器视图的过度滚动 .

这是我为手势探测器设置的 .

public myRecyclerTouchListner(final Context context, final RecyclerView recycleView,
                                                     final LinearLayoutManager linearLayoutManager,
                                                     final ClickListener clicklistener){


            final ViewConfiguration vc = ViewConfiguration.get(context);
            final int swipeMinDistance = vc.getScaledPagingTouchSlop();
            final int swipeThresholdVelocity = vc.getScaledMinimumFlingVelocity();
            final int swipeMaxOffPath = vc.getScaledTouchSlop();

            this.clicklistener=clicklistener;
            simpleGestureDetector =new GestureDetector(context,new GestureDetector.SimpleOnGestureListener( ){
                @Override
                public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                    Log.d("try", "on Fling called");
                    if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE &&
                            Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                        //From Right to Left
                        recycleView.smoothScrollToPosition(linearLayoutManager.
                                findLastCompletelyVisibleItemPosition() + Constants.spanLength);
                        return true;
                    }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE &&
                            Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                        //From Left to Right
                        recycleView.smoothScrollToPosition(linearLayoutManager.
                                findFirstCompletelyVisibleItemPosition() - Constants.spanLength);
                        return true;
                    }

                    return true;
                }

                @Override
                public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {


                    return true;
                }
                @Override
                public boolean onSingleTapUp(MotionEvent e) {
                    return false;
                }

                @Override
                public boolean onDown(MotionEvent e) {
                    return true;
                }

                @Override
                public boolean onDoubleTap(MotionEvent e) {
                    return true;
                }
                @Override
                public void onLongPress(MotionEvent e) {
                    Log.d("Try", "Long press gesture");

                    View child=recycleView.findChildViewUnder(e.getX(),e.getY());
                    if(child!=null && clicklistener!=null){
                        clicklistener.onLongClick(child,recycleView.getChildAdapterPosition(child));
                    }
                }
            });

2 回答

  • 0

    我认为你的问题是滚动是从检测到Fling的最后一个可见位置开始并且弄乱了事情 .

    尝试使用全局变量,例如 int lastScrolledPosition = 0 ;.

    OnFling recycleView.smoothScrollToPosition(lastScrolledPosition + Constants.spanLength);

    我应该这样做 . 如果lastScrolledPosition <Recycleritems计数,您应该更改 .

  • 0

    事实证明,我必须使用Snaphelper进行自定义滚动行为,以防我需要控制程序化滚动和用户滚动(fling) .

    这正是我想要的:How to snap RecyclerView items so that every X items would be considered like a single unit to snap to?

    我希望它会有所帮助:)

相关问题