天天看点

Android权威编程指南笔记 第十一章 使用ViewPager第十一章 使用ViewPager

文章目录

  • 第十一章 使用ViewPager
    • ViewPager
    • 相关小记
    • 挑战练习

第十一章 使用ViewPager

ViewPager

  • 步骤:
  1. 创建ViewPager的视图
  2. 实例化ViewPager
  3. 因为要切换不同的fragment,所以需要获取fragmentManager来进行管理。
  4. 将fm传进

    FragmentStatePagerAdapter(FragmentManager)

    ,并创建匿名实例。
  5. 重写匿名实例的相关方法:

    1.

    getItem(int position)

    获取位置,设置相应模型层数据并返回fragment。

    2.

    getCount()

    返回数量。
  6. ViewPager 是通过

    FragmentStatePagerAdapter()

    的协助处理各项事件。故将其传入

    mViewPager.setAdapter( )

mViewPager =findViewById(R.id.crime_view_pager);
	FragmentManager fragmentManager = getSupportFragmentManager();
        mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) {
            @Override
            public Fragment getItem(int position) {
                Crime crime = mCrimes.get(position);
                return CrimeFragment.newInstance(crime.getId());
            }
            @Override
            public int getCount() {
                return mCrimes.size();
            }

           
  • ViewPager默认只显示PagerAdapter中第一个列表项。故在

    onCreate()

    方法的末尾添加查找方法。通过匹配ID设定当前位置索引。
for (int i = 0 ; i < mCrimes.size() ; i++){
            if (mCrimes.get(i).getId().equals(crimeId)) {
                mViewPager.setCurrentItem(i);
                break;
            }
}
           

相关小记

  • ViewPager默认加载左右相邻页面,可以调用

    setOffscreenPageLimit(int)

    方法定制预加载相邻页面的数目。

    viewPager.setOffscreenPageLimit(5);

  • FragmentPagerAdapter

    FragmentStatePagerAdapter

    区别:
  1. FragmentPagerAdapter

    创建的Fragment视图不会被销毁,实例还保存在FragmentManager的视图中。
  2. FragmentStatePagerAdapter

    会彻底移除不需要的fragment。在有较多数据模型时可以使用以节省内存。
  • 深入学习ViewPager工作原理(P186)
  1. 在托管非fragment视图时(如图片),ViewPager 需要实现原生PageAdapter接口。
  2. RecyclerView 需要处理大量内部实现工作。并且由于其fragment是由fm来管理,而不是由于其自身。故不能立即创建fragment。
  • ViewPager的布局参数不支持边距设置。

挑战练习

  • 恢复ViewPager的边距。
  1. 通过设置子控件的Padding属性即可。
  • 添加Jump to First/Last 按钮。
mToFirstButton = findViewById(R.id.btn_to_first);
        mToFirstButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewPager.setCurrentItem(0);
                mToFirstButton.setEnabled(false);
                mToLastButton.setEnabled(true);

            }
        });

        mToLastButton = findViewById(R.id.btn_to_end);
        mToLastButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewPager.setCurrentItem(mCrimes.size()-1);
                mToLastButton.setEnabled(false);
                mToFirstButton.setEnabled(true);

            }
        });
           
  1. 当不在第一页和最后一页时恢复按钮
if(viewPager.getCurrentItem() != mCrimes.size()-1){
                    mToLastButton.setEnabled(true);
                }
                if(viewPager.getCurrentItem() != 0){
                    mToFirstButton.setEnabled(true);
                }