第十一章 使用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中第一个列表项。故在
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
区别:
FragmentPagerAdapter
创建的Fragment视图不会被销毁,实例还保存在FragmentManager的视图中。FragmentStatePagerAdapter
会彻底移除不需要的fragment。在有较多数据模型时可以使用以节省内存。
- 在托管非fragment视图时(如图片),ViewPager 需要实现原生PageAdapter接口。
- RecyclerView 需要处理大量内部实现工作。并且由于其fragment是由fm来管理,而不是由于其自身。故不能立即创建fragment。
挑战练习
- 通过设置子控件的Padding属性即可。
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);
}