9

Desidero implementare una semplice navigazione a scorrimento utilizzando un ViewPager con frammenti che contengono e gestiscono un RecyclerView.Il funzionamento di ViewPager non funziona con RecyclerView

I frammenti vengono creati e possono essere commutati utilizzando setCurrentItem(), ma non è possibile scorrere verso sinistra o destra per passare da una pagina all'altra. Il ViewPager sembra ignorare qualsiasi gesto di scorrimento.

mio layout di attività:

<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> 

Io popolo della ViewPager utilizzando un FragmentPagerAdapter nel mio onCreate() in questo modo:

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); 
     } 
    }); 

Il layout frammento è un semplice FrameLayout che avvolge un 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> 

L'adattatore ter e il gestore di layout sono fissati in del onCreateView frammento:

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

Modifica # 1

penso non ho chiesto la mia domanda abbastanza chiaro.
Ho un cercapersone funzionante con un TabLayout funzionante che è popolato da un 'FragmentPagerAdapter', il che significa che Frammenti sono stati creati correttamente e il layout della scheda visualizza una scheda cliccabile per ciascun elemento. Ogni frammento di questo ViewPager visualizza uno RecyclerView con uno GridLayoutManager.

Tuttavia, il ViewPager non sembra ricevere alcun movimento di sfioramento. È possibile modificare la posizione selezionata corrente tramite TabLayout, ma non eseguendo il trascinamento, ad esempio, da sinistra a destra.
Sembra che lo RecyclerView consumi tutti gli eventi di scorrimento indipendentemente dalla direzione del layout, impostata su vertical.

Qualche idea?

+0

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

risposta

2

È possibile utilizzare tablayout con Viewpager come questo

<?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> 

impostare anche

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

e metodo setupWithViewPager è come

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); 
    } 
} 

In MatesListFragment, FavoursListFragment ecc avete il vostro RecyclerView layout

+4

Grazie per la risposta. Penso che tu abbia frainteso la mia domanda, mi stavo chiedendo perché la funzionalità di scorrimento di ViewPagers non funzioni. Ho anche una versione di questa attività che contiene un layout di tabulazione, ma i gesti di scorrimento vengono ignorati. – tobs

+1

Ho un codice funzionante con me. Una volta provatelo. – Dharmaraj

Problemi correlati