I want to implement a simple swipe navigation using a ViewPager with fragments that hold and manage a RecyclerView.
The Fragments are created and can be switched using setCurrentItem()
, but you cannot swipe left or right to switch pages. The ViewPager seems to ignore any swipe gesture.
My Activity layout:
<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>
I populate the ViewPager using a FragmentPagerAdapter
in my onCreate()
like so:
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);
}
});
The fragment layout is a simple FrameLayout
which wraps a 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>
The adapter and the layout manager are set in the fragment's onCreateView
:
recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 6, LinearLayoutManager.VERTICAL, false));
Edit #1
I think I did not ask my question clear enough.
I have a working Pager with a working TabLayout that is populated by a 'FragmentPagerAdapter', meaning that Fragments are properly created and the tab layout displays a clickable tab for each item. Every Fragment in this ViewPager displays a RecyclerView
with a GridLayoutManager
.
However, the ViewPager doesn't seem to receive any swipe gesture, You can change the current selected position via the TabLayout
, but not by swiping for example from left to right.
It looks like the RecyclerView
consumes all swipe events regardless of the layout direction, which is set to vertical
.
Any ideas?
You can use tablayout with Viewpager like this
<?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>
Also set
tabLayout = (TabLayout) rv.findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
and Method setupWithViewPager is like
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 etc. you have your RecyclerView layout
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With