天天看點

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);
                }