2016-10-30 2 views
7

Я совсем недавно начал использовать SnapHelper предоставленную внутри Support Library v24 для того, чтобы иметь хороший горизонтальный RecyclerView так же, как в Google Play Store.RecyclerView & SnapHelper -> получить щелкнул/целевой вид

Мой вопрос прост.

С помощью RecyclerView.OnScrollListener я могу быть уведомлен, когда состояние прокрутки оседание (много как с ViewPager.OnPageChangedListener. Это очень важно, потому что, когда свиток оседает, мне нужно, чтобы оживить вид, который будет центром как поведение по умолчанию из LinearSnapHelper. это анимация показывает, что фокус принесен к скоро, чтобы быть центром пункта.

на данный момент, мне удалось получить мнение о том, центрирован, когда состояние прокрутки простаивает через следующая линия:

final int centered = (llm.findLastCompletelyVisibleItemPosition() - llm.findFirstCompletelyVisibleItemPosition())/2 + llm.findFirstVisibleItemPosition(); // where llm is my LinearLayoutManager 

Проблема заключается в том, что запуск анимации при завершении прокрутки является странным: мне действительно нужно плавно воспроизвести анимацию по мере прокрутки прокрутки, чтобы при прокрутке прокрутки анимация завершалась.

Как вы можете видеть, мне трудно найти, какой элемент моего RecyclerView будет одним из центров.


Вот те решения, которые я пробовал до сих пор.

  1. Я пробовал использовать тот же расчет, когда состояние прокрутки установлено на RecyclerView.SCROLL_STATE_SETTLING. К сожалению, вызов методов findVisiblePosition из адаптера, когда прокрутка не простаивает, является плохой идеей: в зависимости от скорости прокрутки видимые элементы при вызове этих так называемых методов могут не совпадать, если прокрутка полный. В самом деле, это скажет мне, какие элементы видны во время разговора. Это делает общий смысл, но мне нужно, чтобы попытаться выяснить это ...

  2. Я попытался простирающийсяLinearSnapHelper так, что, когда onFling(...) называется я могу либо использовать findSnapView(...), чтобы получить представление, что будет щелкнул или используйте findTargetSnapPosition(...), надеясь сказать, какой вид должен быть центрирован при завершении прокрутки;

  3. Я также попытался, когда состояние прокрутки RecyclerView.SCROLL_STATE_SETTLING, чтобы использовать findSnapView(...)

Из всех этих решений, ни один не прошел несколько тестов (пытаясь с разной силой красть & скорости). Некоторые исправили это несколько раз, но ошиблись в разных обстоятельствах, поэтому решение становится непригодным.

Заглянув внутрь LinearSnapHelper, я думаю, что я начал понимать, что каким-то образом после салфетки этот класс вычисляет общие просмотры прокрутки и привязки в нескольких случаях до тех пор, пока необходимо выполнить прокрутку (количество прокрутки) поэтому зная, какой вид будет окончательный снимок зрения ... если я не ошибаюсь, потому что отрезанный не центрирован?

В любом случае, мой главный вопрос: Как я могу узнать, какой предмет моего RecyclerView будет центрирован после салфетки, независимо от его скорости и силы?

ответ

1

Если вы используете LinearSnapHelper, существует метод LinearSnapHelper#findTargetSnapPosition. Он возвращает позицию адаптера для просмотра.

0

Вы можете использовать layoutManager.findFirstCompletelyVisibleItemPosition() при прокрутке.

+0

Спасибо, но я искал способ узнать, какой элемент будет центрирован ** после ** салфетки нет, когда он поселился. – Mackovich

4

Вам необходимо подкласс SnapHelper и переопределить findTargetSnapPosition. Позиция, рассчитанная на super.findTargetSnapPosition(layoutManager, velocityX, velocityY), - это позиция, которую ваш RecyclerView собирается привязать.

SnapHelper snapHelper = new LinearSnapHelper() { 
    @Override 
    public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) { 
     int snapPosition = super.findTargetSnapPosition(layoutManager, velocityX, velocityY); 

     // Do something with snapPosition 

     return snapPosition; 
    } 
}; 
+1

В основном это не так. Часто бывает, что при привязке 'findTargetSnapPosition' возвращается -1. – mradzinski

+0

@mradzinski должно быть что-то странное в вашей настройке. Я использовал этот подход в течение очень долгого времени без каких-либо проблем. –

Смежные вопросы