可以滑动的Fragement(viewpager)

我们在项目中很多都要用到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);
			
		}
	};

源代码下载:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,`Fragment` 和 `ViewPager` 结合使用可以实现滑动切换的效果。通过在 `ViewPager` 中添加多个 `Fragment`,可以实现左右滑动切换不同的页面。需要注意的是,在使用 `ViewPager` 时,需要自定义一个 `PagerAdapter`,用于管理 `ViewPager` 中的 `Fragment`。同时,也可以通过 `TabLayout` 等其他的控件,为 `ViewPager` 添加标签,提高用户体验。 以下是 `ViewPager` 和 `Fragment` 结合使用的示例代码: 1. 在布局文件中添加 `ViewPager` 控件: ``` <androidx.viewpager.widget.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 2. 在 Activity 或 Fragment 中,为 `ViewPager` 设置 Adapter: ``` ViewPager viewPager = findViewById(R.id.view_pager); MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(adapter); ``` 3. 自定义一个 PagerAdapter,用于管理 ViewPager 中的 Fragment: ``` public class MyPagerAdapter extends FragmentPagerAdapter { private static final int PAGE_COUNT = 3; public MyPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case 0: return new Fragment1(); case 1: return new Fragment2(); case 2: return new Fragment3(); default: return null; } } @Override public int getCount() { return PAGE_COUNT; } } ``` 在上述示例代码中,`MyPagerAdapter` 继承自 `FragmentPagerAdapter`,并重写了 `getItem()` 和 `getCount()` 方法,用于返回不同位置的 `Fragment` 对象。通过以上步骤,即可实现使用 `ViewPager` 和 `Fragment` 结合使用,实现滑动切换的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值