zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Kefa and Park
    分土地
    果园里的树
    分解质因数
    素数筛
    cantor的数表
    new一个二维数组
    基础练习 十六进制转八进制
    查函数功能
    concatenate函数
  • 原文地址:https://www.cnblogs.com/sishuiliuyun/p/14707927.html
Copyright © 2011-2022 走看看