我们在项目中很多都要用到fragement,但也有很多项目中一个fragment中会有两个或多个页面页面,这样我们一般会在fragment中嵌套一个viewpager,这样就可以使fragment可以滑动了,但是这样也有一个弊端,就是这个项目写起来会很简单,但是修改起来特别不方便,特别是同组的同事,因为项目不一定是一个人,所以,这样的代码修改起来挺不方便,所以我写了一个fragment的适配器,现在先看看这个效果图:
先来看看适配器
/**
* 为ViewPager添加布局(Fragment),绑定和处理fragments和viewpager之间的�?辑关�?
*
*/
public class FragmentViewPagerAdapter extends PagerAdapter implements
ViewPager.OnPageChangeListener, OnCheckedChangeListener {
private List<Fragment> fragments; // 每个Fragment对应viewPage
private FragmentManager fragmentManager;
private ViewPager viewPager; // viewPager对象
/**
* 当前page索引(切换之前)
*/
private int currentPageIndex = 0;
private RadioGroup radioGroup;
/**
* ViewPager切换页面时的额外功能添加接口
*/
private OnExtraPageChangeListener onExtraPageChangeListener;
public FragmentViewPagerAdapter(FragmentManager fragmentManager,
ViewPager viewPager, List<Fragment> fragments, RadioGroup radioGroup) {
this.fragments = fragments;
this.fragmentManager = fragmentManager;
this.viewPager = viewPager;
this.viewPager.setAdapter(this);
this.viewPager.setOnPageChangeListener(this);
this.radioGroup = radioGroup;
radioGroup.setOnCheckedChangeListener(this);
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public boolean isViewFromObject(View view, Object o) {
return view == o;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(fragments.get(position).getView()); // 移出viewpager两边之外的page布局
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = fragments.get(position);
// isAdded()如果该Fragment对象被添加到了它的Activity中,那么它返回true,否则返回false。
if (!fragment.isAdded()) {
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.add(fragment, fragment.getClass().getSimpleName());
ft.commit();
/**
* 在用FragmentTransaction.commit()方法提交FragmentTransaction对象�?
* 会在进程的主线程中,用异步的方式来执行�? 如果想要立即执行这个等待中的操作,就要调用这个方法(只能在主线程中调用)�?
* 要注意的是,�?��的回调和相关的行为都会在这个调用中被执行完成,因此要仔细确认这个方法的调用位置�?
*/
fragmentManager.executePendingTransactions();
}
if (fragment.getView().getParent() == null) {
container.addView(fragment.getView()); // 为viewpager增加布局
}
return fragment.getView();
}
/**
* 当前page索引页(切换之前)
*
* @return
*/
public int getCurrentPageIndex() {
return currentPageIndex;
}
public OnExtraPageChangeListener getOnExtraPageChangeListener() {
return onExtraPageChangeListener;
}
/**
* 设置页面切换额外功能监听
*
* @param onExtraPageChangeListener
*/
public void setOnExtraPageChangeListener(
OnExtraPageChangeListener onExtraPageChangeListener) {
this.onExtraPageChangeListener = onExtraPageChangeListener;
}
@Override
public void onPageScrolled(int i, float v, int i2) {
if (null != onExtraPageChangeListener) { // 如果设置了额外功能接�?
onExtraPageChangeListener.onExtraPageScrolled(i, v, i2);
}
}
@Override
public void onPageSelected(int i) {
fragments.get(currentPageIndex).onPause(); // 调用切换前Fargment的onPause()
// fragments.get(currentPageIndex).onStop(); // 调用切换前Fargment的onStop()
if (fragments.get(i).isAdded()) {
// fragments.get(i).onStart(); // 调用切换后Fargment的onStart()
fragments.get(i).onResume(); // 调用切换后Fargment的onResume()
}
currentPageIndex = i;
if (null != onExtraPageChangeListener) { // 如果设置了额外功能接�?
onExtraPageChangeListener.onExtraPageSelected(i);
}
((RadioButton) (radioGroup.getChildAt(i))).setChecked(true);
}
@Override
public void onPageScrollStateChanged(int i) {
if (null != onExtraPageChangeListener) { // 如果设置了额外功能接�?
onExtraPageChangeListener.onExtraPageScrollStateChanged(i);
}
}
/**
* page切换额外功能接口
*/
public static class OnExtraPageChangeListener {
public void onExtraPageScrolled(int i, float v, int i2) {
}
public void onExtraPageSelected(int i) {
}
public void onExtraPageScrollStateChanged(int i) {
}
}
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
for (int i = 0; i < radioGroup.getChildCount(); i++) {
if (radioGroup.getChildAt(i).getId() == checkedId) {
viewPager.setCurrentItem(i);
}
}
}
看看适配器的使用:
public class FragmentA extends Fragment{
/**
* 单选按钮组
*/
private RadioGroup bookTabGroup;
private ViewPager bookTabPager;
private ViewPager viewpager;
private FragmentViewPagerAdapter adapter;
private ArrayList<Fragment> list=new ArrayList<Fragment>();
private RadioButton radioButton1;
private RadioButton radioButton2;
private RadioButton radioButton3;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.a_main, null);
// 单选按钮的布局
bookTabGroup = (RadioGroup) view.findViewById(R.id.ll_book_tab);
// viewPage
bookTabPager = (ViewPager) view.findViewById(R.id.vp_book_display_fragment);
radioButton1=(RadioButton)view.findViewById(R.id.tv_new_order);
radioButton2=(RadioButton)view.findViewById(R.id.tv_today_orders);
radioButton3=(RadioButton)view.findViewById(R.id.tv_have_orders);
setData();
// 说在fragment里嵌套fragment,getChildFragmentManager
adapter = new FragmentViewPagerAdapter(getChildFragmentManager(), bookTabPager, list, bookTabGroup);
adapter.setOnExtraPageChangeListener(new OnExtraPageChangeListener());
return view;
}
/**
* 把Fragement放到集合List《Fragment》
*/
private void setData() {
FragmentAA fragment1=new FragmentAA();
FragmentBB fragment2=new FragmentBB();
FragmentCC fragment3=new FragmentCC();
list.add(fragment1);
list.add(fragment2);
list.add(fragment3);
}
/**
* 监听选中了哪一个viewpager
*
*/
public class MyOnClickListener implements View.OnClickListener {
private int index = 0;
public MyOnClickListener(int i) {
index = i;
}
@Override
public void onClick(View v) {
viewpager.setCurrentItem(index);
}
};
源代码下载: