2015-07-07 4 views
2

У меня есть ViewPager с несколькими RecyclerViews как страницы. Я хотел бы реализовать функциональность, где RecyclerViews, которые находятся на других страницах, перемещаются на определенную сумму после того, как пользователь начинает прокручивать страницы.Прокрутка ViewPager's RecyclerView при прокрутке страницы

@Override 
public void onPageScrolled(int position, float offset, int offsetPx) { 
    RecyclerView view1 = getPage(position - 1); 
    RecyclerView view2 = getPage(position + 1); 

    if(scrollNeeded()) { 
     view1.scrollBy(0, 200); 
     view2.scrollBy(0, 200); 
    } 
} 

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

Любая идея, как решить эту проблему? Пользователь не должен видеть этот свиток.

ответ

3

ViewPager сохраняет +1 страницу влево и вправо предварительно загружен. Это означает

  • в самом начале - текущей и следующей одной
  • в самом конце - последней страницы и предыдущей
  • в любом другом месте - ток, предыдущий и следующий

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

Вы можете решить это по-разному.

  1. Самый простой увеличивается количество кэшированных страниц от экрана (например, 3) путем вызова viewPager.setOffscreenPageLimit(3) - более ViewPager.setOffScreenPageLimit(int). Если вы полагаетесь на обновление страницы каждый раз, когда пользователь проводит проверку, это может быть проблемой.

  2. Другой вариант - создание пользовательского представления для вашей страницы RecyclerView и добавление значения прокрутки, которое должно быть установлено снаружи, например.

    // in your custom page view 
    private RecyclerView.Adapter adapter; 
    private boolean needToScroll; 
    
    public void setNeedToScroll(boolean needToScroll) { 
    
        this.needToScroll = needToScroll; 
    
        // if adapter is not null (i.e. already set), scroll as is 
        // and set the value to false 
        if (adapter != null) { 
         this.needToScroll = false; 
         scrollBy(0, 200); 
        } 
    } 
    
    // and then in the place where you define your adapter, but after setting it 
    if (needToScroll) { 
        needToScroll = false; 
        scrollBy(0, 200); 
    } 
    

    Наконец ваш взгляд пейджера прокрутки слушателем

    @Override 
    public void onPageScrolled(int position, float offset, int offsetPx) { 
        if(scrollNeeded()) { 
         Page view1 = getPage(position - 1); 
         Page view2 = getPage(position + 1); 
         view1.needToScroll(true); 
         view2.needToScroll(true); 
        } 
    } 
    
+0

любая идея, как я могу достичь этого типа макета .... я есть LinearLayout и ниже LinearLayout я есть ушки + вид пейджера .. .. имея две вкладки теперь в вкладках, у меня есть recyclverview или gridview в разных вкладках ... я хочу, когда я начну прокручивать данные вкладки viewpagers ... он должен прокручиваться с верхней части страницы, а linearalyout должен выйти из страницы, и пользователь может только просматривать контент, определенный пользователями ..., то есть данные recycliewiew – Erum

+0

@Erum Это вне o f оригинальный вопрос. Создайте новый билет, добавьте скриншот с требуемым макетом и, скорее всего, получите ответ скорее, чем ожидалось. –

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