Skip to content

Instantly share code, notes, and snippets.

@no99gk
Created June 4, 2015 06:06
Show Gist options
  • Select an option

  • Save no99gk/53444486e073a9975ba3 to your computer and use it in GitHub Desktop.

Select an option

Save no99gk/53444486e073a9975ba3 to your computer and use it in GitHub Desktop.
Fix glitches on setting up TabLayout with ViewPager
package io.github.no99gk.play;
import android.support.design.widget.TabLayout;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
/** Helper class which fixes some glitches on TabLayout */
public class TabLayoutHelper {
public static void setupWithViewPager(TabLayout tabLayout, ViewPager viewPager) {
PagerAdapter adapter = viewPager.getAdapter();
if (adapter == null) {
throw new IllegalArgumentException("ViewPager does not have a PagerAdapter set");
}
tabLayout.setTabsFromPagerAdapter(adapter);
ViewPagerBinder.bind(tabLayout, viewPager);
}
private static class ViewPagerBinder
implements TabLayout.OnTabSelectedListener, ViewPager.OnPageChangeListener {
private final Reference<TabLayout> tabLayoutRef;
private final Reference<ViewPager> viewPagerRef;
private int scrollState;
private boolean autoScrolling;
private boolean pendingTabSelection;
private ViewPagerBinder(TabLayout tabLayout, ViewPager viewPager) {
tabLayoutRef = new WeakReference<>(tabLayout);
viewPagerRef = new WeakReference<>(viewPager);
}
static ViewPagerBinder bind(TabLayout tabLayout, ViewPager viewPager) {
ViewPagerBinder binder = new ViewPagerBinder(tabLayout, viewPager);
viewPager.addOnPageChangeListener(binder);
tabLayout.setOnTabSelectedListener(binder);
return binder;
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
TabLayout tabLayout = tabLayoutRef.get();
if (tabLayout != null && !autoScrolling) {
tabLayout.setScrollPosition(position, positionOffset,
scrollState == ViewPager.SCROLL_STATE_DRAGGING
|| (scrollState == ViewPager.SCROLL_STATE_SETTLING
&& (positionOffset == 0f || positionOffset == 1f)));
}
}
@Override
public void onPageSelected(int position) {
selectTab(position);
}
private void selectTab(int position) {
TabLayout tabLayout = this.tabLayoutRef.get();
if (tabLayout != null) {
tabLayout.getTabAt(position).select();
}
}
private void syncTab() {
ViewPager viewPager = viewPagerRef.get();
if (viewPager != null) {
selectTab(viewPager.getCurrentItem());
}
}
@Override
public void onPageScrollStateChanged(int state) {
switch (state) {
case ViewPager.SCROLL_STATE_SETTLING:
if (scrollState == ViewPager.SCROLL_STATE_IDLE) {
autoScrolling = true;
}
break;
case ViewPager.SCROLL_STATE_IDLE:
if (pendingTabSelection) syncTab();
autoScrolling = false;
pendingTabSelection = false;
break;
}
scrollState = state;
}
@Override
public void onTabSelected(TabLayout.Tab tab) {
ViewPager viewPager = viewPagerRef.get();
if (viewPager != null) {
if (scrollState == ViewPager.SCROLL_STATE_SETTLING) {
pendingTabSelection = true;
} else {
viewPager.setCurrentItem(tab.getPosition());
}
}
}
@Override public void onTabUnselected(TabLayout.Tab tab) {}
@Override public void onTabReselected(TabLayout.Tab tab) {}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment