package com.xiaomi.xms.sales.adapter; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import com.xiaomi.xms.sales.ui.BaseFragment; import com.xiaomi.xms.sales.widget.TabIndicator; import java.util.ArrayList; import java.util.List; public class FragmentPagerAdapter extends PagerAdapter implements OnClickListener { private final List<BaseFragment> mFragments = new ArrayList<BaseFragment>(); private final List<TabIndicator> mTabs = new ArrayList<TabIndicator>(); private FragmentManager mFragmentManager; private FragmentTransaction mCurrentTransaction; private TabChangedListener mTabChangedListener; public interface TabChangedListener { public void onTabChanged(int position); } public void setTabChangedListener(TabChangedListener l) { mTabChangedListener = l; } public FragmentPagerAdapter(FragmentManager fm) { mFragmentManager = fm; } @Override public int getCount() { return mFragments.size(); } @Override public boolean isViewFromObject(View view, Object object) { return ((BaseFragment) object).getView() == view; } public BaseFragment getItem(int position) { if (position < 0 || position >= mFragments.size()) { return null; } return mFragments.get(position); } public void addFragment(TabIndicator tab, BaseFragment fragment) { mFragments.add(fragment); mTabs.add(tab); tab.setOnClickListener(this); } @Override public void finishUpdate(ViewGroup container) { if (mCurrentTransaction != null) { mCurrentTransaction.commitAllowingStateLoss(); mCurrentTransaction = null; mFragmentManager.executePendingTransactions(); } } @Override public void destroyItem(ViewGroup container, int position, Object object) { if (mCurrentTransaction == null) { mCurrentTransaction = mFragmentManager.beginTransaction(); } mCurrentTransaction.detach((BaseFragment) object); } @Override public Object instantiateItem(ViewGroup container, int position) { if (mCurrentTransaction == null) { mCurrentTransaction = mFragmentManager.beginTransaction(); } BaseFragment f = getItem(position); mCurrentTransaction.attach(f); return f; } public String getTagByPosition(int position) { if (position < 0 || position > mFragments.size()) { return null; } return mFragments.get(position).getTag(); } public int getPositionByTag(String tag) { for (int i = 0; i < mFragments.size(); i++) { if (TextUtils.equals(tag, mFragments.get(i).getTag())) { return i; } } return 0; } public TabIndicator getTab(int position) { if (position < 0 || position >= mTabs.size()) { return null; } return mTabs.get(position); } public int getTabIndex(TabIndicator tab) { return mTabs.indexOf(tab); } public void selectTab(int position) { for (int i = 0; i < mTabs.size(); i++) { if (position == i) { mTabs.get(i).setSelected(true); } else { mTabs.get(i).setSelected(false); } } } @Override public void onClick(View v) { int i = 0; for (; i < mTabs.size(); i++) { if (mTabs.get(i) == (TabIndicator) v) { if (mTabChangedListener != null) { mTabChangedListener.onTabChanged(i); } break; } } selectTab(i); } @Override public int getItemPosition(Object fragment) { if (getFragmentPosition((BaseFragment) fragment) != POSITION_NONE) { return POSITION_UNCHANGED; } return POSITION_NONE; } public int getFragmentPosition(BaseFragment fragment) { for (int i = 0; i < mFragments.size(); i++) { if ((TextUtils.equals(((BaseFragment) fragment).getTag(), mFragments.get(i).getTag()))) { return i; } } return POSITION_NONE; } /** * 替换Fragment * @param container is the viewpager * @param oldFragment is the old fragment to be replaced * @param newFragment is new fragment to add * @param newTag */ public void replaceFragment(ViewPager container, BaseFragment oldFragment, BaseFragment newFragment, String newTag) { startUpdate(container); if (mCurrentTransaction == null) { mCurrentTransaction = mFragmentManager.beginTransaction(); } int position = getFragmentPosition(oldFragment); mFragments.set(position, newFragment); mCurrentTransaction.remove(oldFragment); mCurrentTransaction.add(container.getId(), newFragment, newTag); finishUpdate(container); mCurrentTransaction = null; notifyDataSetChanged(); } }