1.ViewPager与PagerAdapter
ViewPager在某种程度上类似于RecyclerView。RecyclerView需要借助Adapter提供视图,同样,ViewPager需要PagerAdapter的支持。
Google提供了PagerAdapter的子类FragmentStatePagerAdapter,它提供了getCount()和getItem()方法,化繁为简,能协助处理很多问题。
public class CrimePagerActivity extends AppCompatActivity {
private ViewPager mViewPager;
private List<Crime> mCrimes;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_crime_pager);
mViewPager = findViewById(R.id.crime_view_pager);
mCrimes = CrimeLab.get(this).getCrimes();
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();
}
});
mViewPager.setCurrentItem(int position);
}
}
getCount()和getItem()这两个方法简单直接。getCount()返回数量。getItem()方法根据位置,返回具体的实例。
然而,ViewPager默认只显示PagerAdapter中的第一个列表项。要显示选中的列表项,可进行如下设置:
mViewPager.setCurrentItem(int position);
2.FragmentStatePagerAdapter 与 FragmentPagerAdapter
- FragmentStatePagerAdapter---①
-
FragmentPagerAdapter---②
上述二者的唯一区别在于,①会销毁不需要的fragment。事务提交后,activity的FragmentManager中的fragment会被彻底移除。
相比之下,②有不同的做法。对于不再需要的fragment,②会选择调用事务的detach()方法来处理它,而非remove()方法。也就是说②只是销毁了fragment的视图,而fragment的实例还保留在FragmentManager中。
选择哪种adapter取决于应用的要求。通常来说,使用FragmentStatePagerAdapter更节省内存。
另一方面,如果用户界面只需要少量固定的fragment,则②是安全、合适的选择。最常见的例子就是使用tab选项页显示用户界面。
网友评论