自学安卓编程权威指南(八)

在这篇文章中,我们来学习ViewPager

1.要使用ViewPager的话,那么我们就需要创建一个新的activity用来托管CrimeFragment,这边需要先创建一个activity布局,这个布局将由一个ViewPager实例来组成,这样,当为UI添加ViewPager后,用户就可以用来左右滑动屏幕,看不同的明细界面。

2.接下来。我们需要来完成(1)创建CrimePagerActivity类,(2)定义包含ViewPager的视图层级结构(3)在CrimePagerActivity类中去关联使用ViewPager以及其Adapter

3.应该把CriemPagerActivity的父类定义为AppCompatActivity,然后创建一个activity_crime_pager的布局文件,在这个布局中我们必须使用ViewPager作为根视图,ViewPager来自支持库,所以我们需要来完整的包名;

4.对于ViewPager,它也需要使用PagerAdapter,ViewPager和PagerAdapter之间的关系比较复杂,还好这边有着PagerAdapter的子类(FragmentStatePagerAdapter),它能解决许多细节问题,这个子类使用了两个方法,一个是getCount()也就是返回多少个pager的数量,一个是getItem(int),这个方法可以获取并显示crime数组中指定的Crime时,他会返回配置过的CrimeFragment来显示指定的Crime,如下的代码就可以用来创建一个PagerView的activity

public class CrimePagerActivity extends AppCompatActivity {

private ViewPager mViewPager;

private List<Crime> mCrimes;

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_crime_pager);

mViewPager = (ViewPager)findViewById(R.id.crime_view_pager);

mCrimes = CrimeLab.get(this).getCrimes();

FragmentManager fragmentManaget = getSupportFragmentManager();

mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager)){

public Fragment getItem(int position) {

Crime crime = mCrimes.get(position);

return CrimeFragment.newInstance(crime.getId());

}

public int getCount(){

return mCrimes.size();

}

});

}

}

在上面的代码中,我们在activity视图中找到ViewPager后,我们从CrimeLab中获得数据集,然后获取activity的FragmentManager实例,我们应该设置adapter为FragmentStatePagerAdapter的一个匿名实例,创建FragmentStatePagerAdapter实例需要FragmentManager实例,FragmentStateAdapter是我们的代理,负责管理与ViewPager的对话和工作,代理需要把getIten()方法返回的fragment添加给activity,这样才能使用fragment来完成自己的工作

5.然后我们需要在CrimePagerActivity中去实现数据传输的newIntent()方法,应添加下面的代码:

private static final String EXTRA_CRIME_ID = "com..";

public static Intent newIntent(Context packageContext,UUID crimeId){

Intent intent = new Intent(packageContext,CrimePagerActivity.class);

intent.putExtra(EXTRA_CRIME_ID,crimeId);

return intent;

}

下面的代码是获取数据

UUID crimed = (UUID)getIntent().getSerializablExtra(ESTRA_CRIME_ID);

下面的代码是用来调用的

Intent intent = CrimePagerActivity.newIntent(getActivity(),mCrime.getId());

注意,我们要使用这个activity的话,我们还需要在配置文件中去配置这个activity

6.但此时如果我们点击后退键返回列表然后在点击任何一个列表项的话我们还是会发现进入的还是第一个crime的列表,这是因为ViewPager的默认实现的是呈现第一个item列表项的明细,而不是我们当前点击的列表项,这是因为ViewPager默认只显示PagerAdapter的第一个列表项,要想显示选中的列表项,应该设置ViewPager当前要显示的列表项为crime数组中指定位置的列表项

方法是:循环检查crime的ID,找到所选择的crime再数组中的索引位置,如果crime实例的mID和intent extra的crime ID相比配,设置显示指定位置的列表项

代码如下:

for(int i=0;i<mCrimes.size();i++){

if(mCrimes.get(i).getId().equals(crimeId)){

mViewPager.setCurrentItem(i);

break;

}

}

对于ViewPagerAdapter的两个适配器来说

(1)FragmentStatePagerAdapter是在事务提交后activity的FragmentManager中的fragment会被彻底地移除,但它在销毁时会保存fragment中的Bundle信息,用户切换回来后保存的实例状态会用来生成新的fragment,

(2)FragmentPagerAdapter的只是销毁fragment的视图,而fragment实例还保存在FragmentManager中,它创建的fragment永远不会被销毁

对比上面两个,我们可以看出使用FragmentStatePagerAdapter的可以更节省内存,所以正常我们都使用它。但如果用户界面是只需要规定的fragment,那么FragmentPagerAdapter是安全的,合适的选择。

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值