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