2016-11-20 4 views
0

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

Я хотел бы это RecyclerViews действовать в качестве ViewPagers (на первое, каждая страница первого ViewPager содержал другой ViewPager, но он дал мне плохие выступления):

В каждом RecyclerView, каждая «страница» содержит 9 элементы (размещены в 3 столбцах), и я хотел бы, чтобы пользователь мог прокручивать страницу RecyclerView «страница за страницей». Это означает, что если он находится на первой странице и отправляется вправо, он будет прокрутите страницу до «второй страницы» (в которой находятся позиции в диапазоне от позиции 9 до 17). Кроме того, пользователь не должен иметь возможность прокручивать более одной страницы за раз.

Есть ли способ сделать это гладко? Я думаю, что более простой способ сделать это - использовать и переопределить SnapHelper, но я должен признать, что я не совсем уверен, как продолжить достижение ожидаемого результата.

Спасибо!

+0

Да, обычно вложенные прокручиваемые контейнеры, такие как ScrollView и ViewPager, требуют специальной обработки, обычно делегируя событиям касания родителям и детям, в зависимости от того, что вы делаете. Это довольно странная реализация, и я не уверен, что удобство использования, о котором вы думаете, является эффективным и/или возможным, но есть ключ к тому, чтобы вы начали. – Chisko

+0

И что это за ключ? – IKIKN2

+0

Трудно представить, что вы хотите сделать. Это похоже на это: https://stackoverflow.com/q/47514072/878126? –

ответ

3

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

Вы можете вкладывать RecyclerView в качестве элемента внутри вашего RecyclerView ,

В способе вашего адаптера onCreateViewHolder, возвратите альтернативу ViewHolder в зависимости от предоставленного viewType. Для краткости я сделал это как заявление switch.

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    switch (viewType) { 
     case REGULAR_ITEM: 
      return new RegularItemViewHolder(getRowView(parent, R.layout.list_item_regular); 
     case NESTED_LIST_TYPE: 
      return new NestedRecyclerViewHolder(getRowView(parent, R.layout.list_item_nested_recycler); 
     ... 
} 

    protected View getRowView(ViewGroup parent, @LayoutRes final int layoutRes) { 
    return layoutInflater.inflate(layoutRes, parent, false); 
    } 

ViewHolder

public class NestedRecyclerViewHolder extends RecyclerView.ViewHolder { 

    @BindView(R.id.my_nested_recyclerview) 
    public RecyclerView recyclerView; 

    public NestedRecyclerViewHolder(View itemView) { 
     super(itemView); 
     ButterKnife.bind(this, itemView); 
    } 
} 

Затем в onBindViewHolder вы можете настроить это вложенная RecyclerView с горизонтальным LinearLayoutManager (Это предполагает, что у вас есть вертикальный родитель RecyclerView, в течение которого вы хотели бы один или более строки должны быть горизонтальными RecyclerView).

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
// find the item type based on the position 
if(rowType == NESTED_LIST_TYPE) { 
    NestedRecyclerViewHolder viewHolder = (NestedRecyclerViewHolder)holder; 
    viewHolder.recyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)); 
    viewHolder.recyclerView.setAdapter(new MyAdapter()); 
    // continue to set up the nested `RecyclerView` as you would a regular one 
} 
... 

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

Чтобы заставить его вести себя как ViewPager, вы должны были бы использовать SnapHelper как вы упоминались в вашем вопросе:

  1. Установите ширину элементов списка в адаптере вложенной RecyclerView «S к match_parent (сделайте это в XML-макете для элементов).
  2. Инициализировать LinearSnapHelper (Библиотека поддержки 24.1) как это:

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

Это даст вам поведение, в котором пользователь может видеть только один пункт в то время, и позволить пользователю пролистывать отдельные горизонтальные взгляды.

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