El desplazamiento de ViewPager no funciona con RecyclerView
Quiero implementar una navegación sencilla de desplazamiento con un ViewPager con fragmentos que contienen y administran un RecyclerView.
Los Fragmentos se crean y se pueden cambiar usando setCurrentItem()
, pero no se puede desplazar a la izquierda oa la derecha para cambiar de página. El ViewPager parece ignorar cualquier gesto de deslizamiento.
- LinearLayoutManager setReverseLayout () == true pero pila de elementos desde la parte inferior
- StaggeredGridLayoutManager y elementos en movimiento
- Horizontal RecyclerView interior vertical ScrollView
- RecyclerView con GridLayoutManager
- Cómo abrir un fragmento diferente en recyclerview OnClick
Mi esquema de actividad:
<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>
Relleno el ViewPager usando un FragmentPagerAdapter
en mi onCreate()
así:
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); } });
El diseño del fragmento es un FrameLayout
simple que envuelve 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>
El adaptador y el gestor de diseño se establecen en onCreateView
del fragmento:
recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); recyclerView.setHasFixedSize(true); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 6, LinearLayoutManager.VERTICAL, false));
Editar # 1
Creo que no hice mi pregunta lo suficientemente clara.
Tengo un paginador de trabajo con un TabLayout de trabajo que se puebla por un 'FragmentPagerAdapter', significando que los fragmentos se crean correctamente y la disposición de la lengüeta visualiza una lengüeta clickable para cada artículo. Cada fragmento en este ViewPager muestra un RecyclerView
con un GridLayoutManager
.
Sin embargo, el ViewPager no parece recibir ningún gesto de deslizamiento, puede cambiar la posición seleccionada actual a través de TabLayout
, pero no pasando por ejemplo de izquierda a derecha.
Parece que el RecyclerView
consume todos los eventos de desplazamiento independientemente de la dirección de diseño, que se establece en vertical
.
¿Algunas ideas?
- Android Cómo reciclar el mapa de bits correctamente cuando se utiliza RecyclerView?
- SwipeRefreshLayout sin animación en la creación de fragmentos
- RecyclerView Varias vistas de disposición en una clase de adaptador
- Android RecyclerView - animar la elevación del elemento al tocar
- Desplazar SwipeRefreshLayout con RecyclerView Actualizar en cualquier lugar de android 2.2
- Cómo configurar la aplicación RecyclerView: layoutManager = "" de XML?
- Cómo implementar ItemAnimator de RecyclerView para deshabilitar la animación de notifyItemChanged
- RecyclerView desplazamiento laggy
Puedes usar tablayout con Viewpager como este
<?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>
También establecido
tabLayout = (TabLayout) rv.findViewById(R.id.tabs); tabLayout.setupWithViewPager(viewPager);
Y el método setupWithViewPager es como
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); } }
En MatesListFragment, FavoursListFragment etc. tienes tu diseño de RecyclerView
- Banners de aplicaciones inteligentes; Aplicación de la tienda de Windows ¿Equivalente de meta-etiqueta HTML para Android / Google Play?
- Cómo ofuscar un apk con Proguard a través de Eclipse?