文章目录
- 第十一章 使用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);
}