9

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

Фрагменты создаются и могут переключаться с использованием setCurrentItem(), но вы не можете прокручивать влево или вправо, чтобы переключаться между страницами. Кажется, что ViewPager игнорирует любые жесты.

Моя раскладка активность:

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 

    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewPager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginTop="?attr/actionBarSize"/> 

    <android.support.v7.widget.Toolbar 
        ...     /> 

</FrameLayout> 

Я заселить ViewPager используя FragmentPagerAdapter в моем onCreate() так:

viewPager = (ViewPager) findViewById(R.id.viewPager); 
viewPager.addOnPageChangeListener(this); 
viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) { 
     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
        return new Dummy2Fragment(); 

       case 1: 
        return new Dummy2Fragment(); 

       default: 
        return null; 
      } 
     } 

     @Override 
     public int getCount() { 
      return 2; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return "Dataset " + (position + 1); 
     } 
    }); 

Компоновка фрагмент представляет собой простой FrameLayout, который оборачивает RecyclerView:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@color/background_material_light"/> 

</FrameLayout> 

Адаптация тер и менеджер компоновки устанавливаются в фрагменте onCreateView:

recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); 
recyclerView.setHasFixedSize(true); 
recyclerView.setAdapter(adapter); 
recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 6, LinearLayoutManager.VERTICAL, false)); 

Редактировать # 1

Я думаю, что я не задавал мой вопрос достаточно ясно.
У меня есть рабочий пейджер с рабочим TabLayout, который заполняется «FragmentPagerAdapter», что означает, что Фрагменты созданы правильно, а макет вкладки отображает интерактивную вкладку для каждого элемента. Каждый фрагмент в этом ViewPager отображает RecyclerView с GridLayoutManager.

Однако ViewPager, кажется, не воспринимает какой-либо жест жестокого движения. Вы можете изменить текущее выбранное положение с помощью TabLayout, но не путем прокрутки, например, слева направо.
Похоже, что RecyclerView потребляет все события салфетки независимо от направления макета, который установлен на vertical.

Любые идеи?

+0

https://androidbeasts.wordpress.com/2015/08/11/tabs-with-swipe-views/#more-79 – Aakash

ответ

2

Вы можете использовать tablayout с ViewPager как этот

<?xml version="1.0" encoding="utf-8"?> 

<android.support.design.widget.CoordinatorLayout  
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/main_content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 

    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:layout_scrollFlags="scroll|enterAlways" 
     app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 

    <android.support.design.widget.TabLayout 
     android:id="@+id/tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 

     /> 

</android.support.design.widget.AppBarLayout> 

<android.support.v4.view.ViewPager 
    android:id="@+id/viewpager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 


</android.support.design.widget.CoordinatorLayout> 

Также установлено

tabLayout = (TabLayout) rv.findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(viewPager); 

и метод setupWithViewPager подобен

private void setupViewPager(ViewPager viewPager) { 
     adapter = new Adapter(getChildFragmentManager()); 
     adapter.addFragment(new MatesListFragment(), "Mates"); 
     adapter.addFragment(new FavoursListFragment(), "Favours"); 
     adapter.addFragment(new FavemeListFragment(), "FavMe"); 
     viewPager.setAdapter(adapter); 
} 


class Adapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragments = new ArrayList(); 
    private final List<String> mFragmentTitles = new ArrayList(); 

    public Adapter(FragmentManager fm) { 
     super(fm); 
    } 

    public void addFragment(Fragment fragment, String title) { 
     mFragments.add(fragment); 
     mFragmentTitles.add(title); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragments.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragments.size(); 
    } 

    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
    } 
    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitles.get(position); 
    } 
} 

В MatesListFragment, FavoursListFragment и т.д. у вас есть свой RecyclerView макет

+4

Спасибо за ваш ответ. Я думаю, вы неправильно поняли мой вопрос, мне было интересно, почему функциональность Sweep ViewPagers не работает. У меня также есть версия этого действия, содержащая макет табуляции, но там же игнорируются жестов переноса. – tobs

+1

У меня есть рабочий код со мной. Попробуйте это. – Dharmaraj

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