Android多个TAB选项卡切换效果

2019-12-10 18:17:37王旭


上面代码中的界面就是xml中包含了一个PullToRefreshListView,比较简单这个地方就不贴出来了,我们看到在listViewAddHeader中,这个地方添加了一个与悬浮头等高的头部,这样就可以将内容区域给呈现出来,不会被悬浮头遮挡,其次在list的listener中我们将onScorll传到了主界面,这样Listview滚动,就可以将当前滚动的距离计算出来,修正悬浮头的距离。

我们再贴出上面剩下的代码ScrollTabHolderFragment.java与ScrollTabHolder.java

public abstract class ScrollTabHolderFragment extends Fragment implements ScrollTabHolder {

  private int fragmentId;

  protected ScrollTabHolder scrollTabHolder;

  public void setScrollTabHolder(ScrollTabHolder scrollTabHolder) {
    this.scrollTabHolder = scrollTabHolder;
  }

  @Override
  public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount,
      int pagePosition) {
    // nothing
  }

  @Override
  public void onHeaderScroll(boolean isRefreashing, int value, int pagePosition) {

  }

  public int getFragmentId() {
    return fragmentId;
  }

  public void setFragmentId(int fragmentId) {
    this.fragmentId = fragmentId;
  }
}


public interface ScrollTabHolder {

  void adjustScroll(int scrollHeight);

  void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount, int pagePosition);

  void onHeaderScroll(boolean isRefreashing, int value, int pagePosition);
}


最后我们来看看adaper

public class SlidingPagerAdapter extends FragmentPagerAdapter {

  protected final ScrollTabHolderFragment[] fragments;

  protected final Context context;

  private SparseArrayCompat<ScrollTabHolder> mScrollTabHolders;
  private ScrollTabHolder mListener;

  public int getCacheCount() {
    return PageAdapterTab.values().length;
  }

  public SlidingPagerAdapter(FragmentManager fm, Context context, ViewPager pager) {
    super(fm);
    fragments = new ScrollTabHolderFragment[PageAdapterTab.values().length];
    this.context = context;
    mScrollTabHolders = new SparseArrayCompat<ScrollTabHolder>();
    init(fm);
  }

  private void init(FragmentManager fm) {
    for (PageAdapterTab tab : PageAdapterTab.values()) {
      try {
        ScrollTabHolderFragment fragment = null;

        List<Fragment> fs = fm.getFragments();
        if (fs != null) {
          for (Fragment f : fs) {
            if (f.getClass() == tab.clazz) {
              fragment = (ScrollTabHolderFragment) f;
              break;
            }
          }
        }

        if (fragment == null) {
          fragment = (ScrollTabHolderFragment) tab.clazz.newInstance();
        }

        fragments[tab.tabIndex] = fragment;
      } catch (InstantiationException e) {
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      }
    }
  }

  public void setTabHolderScrollingListener(ScrollTabHolder listener) {
    mListener = listener;
  }

  @Override
  public ScrollTabHolderFragment getItem(int pos) {
    ScrollTabHolderFragment fragment = fragments[pos];
    mScrollTabHolders.put(pos, fragment);
    if (mListener != null) {
      fragment.setScrollTabHolder(mListener);
    }
    return fragment;
  }

  public SparseArrayCompat<ScrollTabHolder> getScrollTabHolders() {
    return mScrollTabHolders;
  }

  @Override
  public int getCount() {
    return PageAdapterTab.values().length;
  }

  @Override
  public CharSequence getPageTitle(int position) {
    PageAdapterTab tab = PageAdapterTab.fromTabIndex(position);
    int resId = tab != null ? tab.resId : 0;
    return resId != 0 ? context.getText(resId) : "";
  }

}