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

时间:2018-01-14 18:43:12

标签: android android-recyclerview smooth-scrolling gesturedetector fling

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

回收者视图可以同时滚动,它是1到20之间的项目循环。

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

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

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

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

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

    这是我为手势检测器设置的。

    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 :(得分:0)

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

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

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

我认为应该这样做。如果lastScrolledPosition< Recycleritems数量。

答案 1 :(得分:0)

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

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

我希望它会有所帮助:)