Прокрутите фиксированное количество элементов на Fling/ прокрутки до просмотра переработчика

У меня есть простое действие, которое имеет корневой макет. Корневой макет содержит обзор переработчика. Recyclerview будет содержать 20 элементов, созданных из items.xml, который состоит из 3-х текстовых представлений. Здесь items.xml представляют отдельный элемент в recyclerview.

Представление "Переработчик" можно прокручивать в обоих направлениях, оно представляет собой цикл пунктов от 1 до 20.

У меня есть требование сглаживать только 4 элемента, независимо от скорости пролистывания / броска.

Подходы, которые я испробовал, но до сих пор не удалось. Если кто-то может дать какие-либо предложения, это было бы очень полезно.

  1. SnapHelper - кажется, что он привязывает только тот элемент, который находится в центре.

  2. Использование детектора жестов - жесты обнаруживаются для всех действий, но я не могу предотвратить стандартную прокрутку в режиме просмотра.

Основной проблемой является чрезмерная прокрутка окна рециркулятора из-за изменяющихся скоростей пользовательских прокруток и бросков.

Вот мои настройки для детектора жестов.

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 ответа

Я думаю, что ваша проблема в том, что прокрутка начинается с последней видимой позиции, где обнаружен Флинг, и это все портит.

Попробуйте с глобальной переменной например int lastScrolledPosition = 0;.

А также OnFlingrecycleView.smoothScrollToPosition(lastScrolledPosition + Constants.spanLength);

Я думаю, что это должно сработать. Вы должны изменить, если lastScrolledPosition

Оказывается, мне пришлось использовать Snaphelper для пользовательского поведения прокрутки в случае, когда мне нужен контроль над программной прокруткой и пользовательской прокруткой (переключением).

Это было именно то, что я искал: как привязать элементы RecyclerView, чтобы каждый элемент X рассматривался как единое целое для привязки?

Я надеюсь, что это будет полезно:)

Другие вопросы по тегам