2016-03-31 4 views
5

Я пытаюсь реализовать поведение, похожее на ViewPager, для горизонтального RecyclerView. Данные от адаптера должны раздуваться и связываться как обычно, но переключение через Recycler должно выполняться по-разному. Когда пользователь совершает прокрутку (или пытается выполнить прокрутку), я перемещаю Recycler один предмет в этом направлении, придерживая его влево.Пейджер-подобное поведение в RecyclerView

У меня уже есть все элементы логики перехода. Я использую пользовательский LayoutManager, который переопределяет onSmoothScrollToPosition() с пользовательским LinearSmoothScroller(), который делает элемент слева.

Вопрос в том, как я могу переопределить поведение прокрутки RecyclerView, чтобы перехватывать удары и обрабатывать их самостоятельно? Я попытался отключить прокрутку в LayoutManager, а затем перехватил жест в onTouchListener, но это, похоже, не работает. У рамки RecyclerView есть чистый способ справиться с этим?

+0

Я думаю, перехватывая жест в 'onTouchListener' уже должен сделать трюк. Что не работает над этим решением? – EpicPandaForce

+0

Ну, по какой-то причине он ничего не перехватывает. Я предполагаю, что это может быть вызвано тем, что горизонтальный Recycler находится на странице большего пейджера (фрагмент пейджера для разделов приложения), и он просто передает жест в верхний пейджер :( – Kelevandos

+0

@EpicPandaForce Мне удалось получить его чтобы работать, оказывается, мне пришлось реализовать onScroll() в SimpleGestureListener, а не только onFling(). Однако есть и проблема с этим - метод onScroll() будет запускаться несколько раз, в результате чего Recycler проходит через все элементы сразу обрабатываются? – Kelevandos

ответ

0

Установите ваши RecyclerView «ы LayoutManager к

final StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.HORIZONTAL); mRecyclerView.setLayoutManager(layoutManager);

+0

И как это поможет? – Kelevandos

+0

@Kelevandos использует пользовательский scrollview для обнаружения YScroll. [reference] (http: // stackoverflow.com/questions/2646028/android-horizontalscrollview-in-scrollview-touch-handling) – Aks4125

+0

Вы имеете в виду оболочку ScrollView для RecyclerView? Это может сработать, но я надеюсь, что есть способ справиться с этим чистым способом, используя инфраструктуру RecyclerView :-( – Kelevandos

2

есть библиотека layoutmanagers именно для этого.

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

Для этого вам просто нужно установить его как обычный менеджер компоновки:

recyclerView.setLayoutManager(new ViewPagerLayoutManager(getActivity())); 

для получения дополнительной информации и примеров проверить here

+0

Это работает, но это заставляет recycler работать на 100%, как пейджер, что означает, что один ребенок видится за раз. Это не то, что я хочу :-( – Kelevandos

+0

вы можете просто использовать другой, если хотите увидеть или пронести несколько элементы, например SnapperLinearLayoutManager – djodjo

+1

отлично работает –

1

Нативный Android решение рассматривается в this пост был супер легкий путь чтобы заставить RecyclerView вести себя как ViewPager.

Соответствующие биты:

версия библиотеки поддержки 24.2.0 представила два новых класса (SnapHelper и LinearSnapHelper), которые должны использоваться для обработки щелкать в RecyclerView. .... Единственный код нужно, это:

SnapHelper snapHelper = new LinearSnapHelper(); snapHelper.attachToRecyclerView(recyclerView);

SnapHelper snapHelper = new GravitySnapHelper(Gravity.START); snapHelper.attachToRecyclerView(startRecyclerView);

+1

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

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