ViewPager(一) 初相识

ViewPager常用吗?

ViewPager是一个灵活切换页面场景中广泛使用的一个容器,我们所熟知的绝大部分App应用都使用了它。型如WeChat,今日头条,淘宝等中的主界面,在不同的类型button下切换View。由于其出色的缓存机制,v4包的加成,使其处理平级页面间切换更加的得心应手,也备受广大程序员所青睐。

Google是这样定义ViewPager的:

Layout manager that allows the user to flip left and right through pages of data.

翻译过来就是:ViewPager是一个允许用户左右翻转数据页的布局管理器

有了这个或通俗或专业的解释,我们了解了其重要性,接下来就是展现它实力的时候了。

ViewPager怎么用?

根据分层思想及责任明确分离的思想,严谨的谷歌工程师,肯定不会把所有的处理逻辑放在这一个类里来处理,对于数据和 View 的处理,ViewPager 使用了和 ListView 列表容器相似的适配器类,ViewPager 的适配器叫 PagerAdapter,这是一个抽象类,不能实例化,所以他还有两个儿子,FragmentPagerAdapter 和 FragmentStatePagerAdapter,从名字,我们能够猜到,都是处理页面是Fragment的情况,而 PagerAdapter 则是处理通用View的适配器,只是使用它的时候我们一定要自定义一个类继承这个基类。

那么为什么Fragment谷歌要给两个适配器来处理呢?

Fragment 是个大号的容器,里边可以展示大量的页面,处理大量的列表,所以每一页,可能会是有大量的数据,而前一个适配器 FragmentPagerAdapter 是一个不管理 Fragment 状态的适配器,这就意味着,许多碎片的 Fragment 会占用大量的内存(在少数情况下Fragment还是有可能会丢失的),如果在 Fragment 页面较少,或者每个 Fragment 页面中持有的数据较少的情况下,我们可以选择使用较为简单的适配器,不用关注并管理 Fragment 的状态,加快业务开发;另一种情况及时当大量碎片的 Fragment 占用的内存是不能被容忍的,这个时候后一个适配器 FragmentStatePagerAdapter 就派上用场了。这个适配器保存并绑定了状态,在状态为销毁的状态下,可以去重新获取。但是频繁创建又会导致切换页面的性能消耗。所以在选择对应的适配器的时候,要根据具体的业务逻辑进行判断,选择合适的适配器。

谷歌为开发者提供的这两个亲儿子,其实是考虑了大量的应用场景,在一级页面下的同级切换,用的最多的一定会是Fragment,而熟悉Fragment使用的开发人员就会知道Fragment创建和销毁涉及FragmentManager 和FragmentTransaction,而这些逻辑也是很头疼的,谷歌的提供的这两个适配器就是帮你解决这个烦恼的。你只需要在创建他们的时候传入FragmentManager,其他的attach和detach就不用你来管了。

说了这么多,终于到了撸码的时刻了!!!

我们一边撸,一边说。。。

  • 第一部分:初始化 Activity,初始ViewPager里边的 Fragments
public class FragmentAdapterDemoActivity extends AppCompatActivity {

	private ViewPager mPager;
	private MyAdapter mAdapter;
	private List<Fragment> mFragments;
	private String[] mTags = new String[]{"message","friend","circle"};
	@Override
    protected void onCreate(Bundle savedInstanceState) {
      //省略填充布局。。。
      
        initView();
        initAdapter();
    }
	private void initView() {
		mPager = findViewById(R.id.pager);
		mFragments = new ArrayList<>();
		//三个Fragment
		MessageFragment messageFragment = MessageFragment.newInstance(mTags[0]);
		FriendFragment friendFragment = FriendFragment.newInstance(mTags[1]);
		CircleFragment circleFragment = CircleFragment.newInstance(mTags[2]);
		//Fragment容器
		mFragments.add(messageFragment);
		mFragments.add(friendFragment);
		mFragments.add(circleFragment);
	}
}
  • 第二部分:初始化适配器
private void initAdapter() {
	mAdapter = new MyAdapter(getSupportFragmentManager());
	mPager.setAdapter(mAdapter);
}
  • 第三部分:继承 FragmentPagerAdapter 生成自定义Adapter
class MyAdapter extends FragmentPagerAdapter {
        public MyAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragments.get(position);
        }
        @Override
        public int getCount() {
            return mFragments.size();
        }
    }

主要的方法是两个:

Fragment getItem (int position);//返回对应位置的 Fragment ,加载 ViewPager 的子 View 的关键方法
int getCount();//返回子 View 的数量,或者需要显示子 View 的数量,在 ViewPager 的绘制流程要用

三个子 View 的 Fragment 这里就不贴代码了,主要是通过 newInstance 方法返回各自的实例

以上代码就能实现一个简单的三个子View滑动的ViewPager,第一次接入是不是感觉很简单,很顺滑呀?

不过 ViewPager 的事情还没结束呢,上边代码分析了两个亲儿子的区别,代码中没有呀?

别着急,篇幅有限,我们接着下一篇 ViewPager(二) Adapter的爱恨情仇
————————————————
版权声明:本文为CSDN博主「郝振兴」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39095733/article/details/84109985

原文地址:https://www.cnblogs.com/sishuiliuyun/p/14707927.html