Различие между действием "Перемещение" и действием "Отбрасывание" в режиме рециклирования

Recyclerview сейчас имеет 3 состояния.

SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING

Проблема поднята для того, чтобы включить состояние fling. Я не могу определить, было ли сделано что-либо по этому поводу.

Есть ли способ разграничения между Drag и Fling в recyclerview.

РЕДАКТИРОВАНИЕ: Требование для таких функций: когда пользователь бросается, я хочу, чтобы у меня была возможность приостановить загрузку изображений (все изображения - запросы на URL) в ресайклере и возобновить его, когда он достигнет интересующего объекта, тем самым гарантируя, что изображение, которое он представляет в настоящее время просматривает грузы до других.

Ответы

Ответ 1

SCROLL_STATE_FLING: больше не является частью RecyclerView как это не упоминается в документации здесь

Относительно вашего требования:

RecyclerView находится внутри android.view.ViewGroup и в соответствии с его исходным кодом extends ViewGroup документацию extends ViewGroup здесь.

Прокрутка в RecyclerView является своего рода разделением между RecyclerView и LinearLayoutManager. Есть два случая, которые необходимо обработать:

  1. Пользователь бросает взгляд. Поведение по умолчанию состоит в том, что RecyclerView передает сброс внутреннему Scroller, который затем выполняет магию прокрутки. Это проблематично, потому что тогда RecyclerView обычно располагается в неприкрепленном положении. Решите это путем переопределения реализации fling fling() в RecyclerView и вместо того, flinging, smoothscroll LinearLayoutManager в позицию.
  2. Пользователь поднимает палец с недостаточной скоростью, чтобы запустить прокрутку. В этом случае не происходит сброса. Если вы хотите обнаружить этот случай в том случае, если представление не находится в привязанном положении, вы можете сделать это, переопределив метод onTouchEvent.

Смотрите здесь для подробной прокрутки Snappy в RecyclerView

Несколько подсказок ViewPager, которые стоит упомянуть, поскольку RecyclerView является его дочерним элементом:

  1. Подумайте об изменении количества страниц, которые кэшируются. Это особенно важно, когда у вас есть только 3 или 4 страницы. Настройка по умолчанию сохранит 1 страницу с каждой стороны текущей страницы. В случае, если у вас есть 3 страницы, переход к средней странице будет означать, что все ваши страницы будут кэшированы. Затем переход к первой или последней странице приведет к удалению одной из страниц из памяти, и ее необходимо будет заново создать и добавить снова, когда вы проведете снова. Установив setOffscreenPageLimit(2) вы позволите всем своим страницам постоянно оставаться в памяти. Это компромисс между производительностью и соображениями памяти, поэтому рекомендуется выслушивать предупреждения о нехватке памяти и быть готовыми к удалению пограничных страниц, если это необходимо.

  2. Если вы пытаетесь заменить Views в ViewPager, недостаточно просто изменить набор данных за адаптером и вызвать notifyDataSetChanged(). Вам также необходимо убедиться, что вы правильно реализовали getItemPosition(Object object) и вернуть POSITION_NONE для элементов, которые изменились, и вернуть POSITION_UNCHANGED или фактическую позицию для элементов, которые не изменились.

  3. Другой API, который был добавлен, это setPageMargin() и setPageMarginDrawable(), что позволяет вам легко разделять ваши страницы.

Смотрите здесь для подробного просмотра горизонтальных представлений с помощью ViewPager, Обновлено

Разница между перетаскиванием и броском

Для функции перетаскивания Вы можете использовать некоторые из сопутствующих классов RecyclerView's:

  1. ItemTouchHelper, который представляет собой служебный класс для добавления свайпа, чтобы отклонить и перетащить поддержку в RecyclerView.

  2. его ItemTouchHelper.Callback, который является контрактом между ItemTouchHelper и вашим приложением

За броском видно

  1. Android бросает действия на RecyclerView

  2. Android: плавная прокрутка

Ответ 2

Для этого я использую сочетание SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING: вот мой код:

@Override
            public void onScrollStateChanged(int newState) {
                if (newState == RecyclerView.SCROLL_STATE_DRAGGING || newState == RecyclerView.SCROLL_STATE_SETTLING) {
                    if (mAdapter != null)
                        mAdapter.pauseImageLoading();
                } else if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    if (mAdapter != null)
                        mAdapter.resumeImageLoading();
                }

это работает для меня так же, как вы хотите, чтобы оно возобновилось, когда пользователь остановился на интересующем предмете

Ответ 3

Ваша проблема может быть потенциально решена по-другому. Вы можете попытаться отложить свои запросы на пару сотен миллисекунд (точное число нужно будет настроить). Если элемент списка прокручивается за кадром за эти миллисекунды, вы можете отменить запрос до его отправки. Идея состоит в том, что, если вы бросаете, представления будут прокручивать экран так быстро, что запросы всегда будут отменены до их отправки. Если они не бросаются, эти лишние миллисекунды за запрос, надеюсь, не так уж плохи из опыта.