文章目錄
- 第十一章 使用ViewPager
-
- ViewPager
- 相關小記
- 挑戰練習
第十一章 使用ViewPager
ViewPager
- 步驟:
- 建立ViewPager的視圖
- 執行個體化ViewPager
- 因為要切換不同的fragment,是以需要擷取fragmentManager來進行管理。
- 将fm傳進
,并建立匿名執行個體。
FragmentStatePagerAdapter(FragmentManager)
重寫匿名執行個體的相關方法:
1.
getItem(int position)
擷取位置,設定相應模型層資料并傳回fragment。
2.
傳回數量。
getCount()
- 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中第一個清單項。故在
方法的末尾添加查找方法。通過比對ID設定目前位置索引。
onCreate()
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
建立的Fragment視圖不會被銷毀,執行個體還儲存在FragmentManager的視圖中。
FragmentPagerAdapter
會徹底移除不需要的fragment。在有較多資料模型時可以使用以節省記憶體。
FragmentStatePagerAdapter
- 深入學習ViewPager工作原理(P186)
- 在托管非fragment視圖時(如圖檔),ViewPager 需要實作原生PageAdapter接口。
- RecyclerView 需要處理大量内部實作工作。并且由于其fragment是由fm來管理,而不是由于其自身。故不能立即建立fragment。
- ViewPager的布局參數不支援邊距設定。
挑戰練習
- 恢複ViewPager的邊距。
- 通過設定子控件的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);
}
});
- 當不在第一頁和最後一頁時恢複按鈕
if(viewPager.getCurrentItem() != mCrimes.size()-1){
mToLastButton.setEnabled(true);
}
if(viewPager.getCurrentItem() != 0){
mToFirstButton.setEnabled(true);
}