Android编程权威指南——ViewPager
CrimePagerActivity是AppCompatActivity的子类。在Criminallntent应用中,其任务是创建并管理ViewPager。
以AppCompatActivity为超类,创建CrimePagerActivity新类并为其配置视图,如下代码所示。
创建ViewPager(CrimePagerActivity.java)
public class CrimePagerActivity extends AppCompatActivity {
@0verride
protected void onCreate(BundLe savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R. Layout.activity_crime_pager);
}
在res/layout/目录下创建名为activity_crime_pager的布局文件。注意,必须使用ViewPager的完整包名(android.support.v4.view.ViewPager)。
在CrimePagerActivity中,设置ViewPager的pager adapter,并实现它的getCount()方法和getItem(int)方法,如代码所示。
设置pager adapter(CrimePagerActivity.java)
public class CrimePagerActivity extends AppCompatActivity {
private ViewPager mViewPager;
private List mCrimes;
@0verride
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 fragmentManager = getSupportFragmentManager();
mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager){
@0verride
pubLic Fragment getItem(int position){
Crime crime = mCrimes.get(position);
return CrimeFragment.newInstance(crime.getId());
@Override
pubLic int getCount() {
return mCrimes.size( );});
}
新增newIntent方法和crime ID的extra常量,如代码所示。
创建newIntent方法(CrimePagerActivity.java)
public class CrimePagerActivity extends AppCompatActivity {
private static final String EXTRA_CRIME_ID =
"com.bignerdranch.android.criminalintent.crime_id";
private ViewPager mViewPager;
private List mCrimes;
public static Intent newIntent(Context packageContext,UID crimeId){
Intent intent = new Intent(packageContext,CrimePagerActivity.cLass);
intent.putExtra(EXTRA_CRIME_ID,crimeId);
return intent;
@0verride
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_crime_pager);
uID crimeId = (UUID) getIntent()
.getSerializableExtra(EXTRA_CRIME_ID);
回到CrimeListFragmentjava文件,修改CrimeHoLder.onCLick(View)方法以启动Crime- PagerActivity,如代码所示。
配置启动CrimePagerActivity(CrimeListFragment.java)
private class CrimeHolder extends RecyclerView.ViewHoLder
implements View.0nClickListener {
…
@0verride
public void onCLick(View view) {
Intent-intent-=-CFimeActivity-newIntent(getActivity(),mCrime-getId() Intent intent= CrimePagerActivity.newIntent(getActivity()
,mCrime.getId()); startActivity(intent);
最后,要让操作系统启动CrimePagerActivity,还要在manifest配置文件中添加它,如代码所示。打开AndroidManifest.xml,添加CrimePagerActivity声明,同时删除不再使用的CrimeActivity声明;也可以直接将CrimeActivity重命名为CrimePagerActivity。
添加CrimePagerActivity到manifest配置文件
(AndroidManifest.xml)
<manifest …>
…
<appLication …>
<activity
android;name=". CrimeAetivity"
android:name=".CrimePagerActivity">
从项目工具窗口中删除CrimeActivityjava文件,让项目代码更干净。
运行Criminalntent应用。查看明细。
在CrimePagerActivity.onCreate(BundLe)方法的末尾,循环检查crime的ID,找到所选 crime在数组中的索引位置。如果Crime实例的mId与intentextra的crimeId相匹配,设置显示指定位置的列表项,如代码所示。
设置初始分页显示项(CrimePagerActivity.java)
public class CrimePagerActivity extends AppCompatActivity {
@0verride
protected void onCreate(BundLe savedInstanceState){
FragmentManager fragmentManager = getSupportFragmentManager();
mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager){});
for (int i = 0;
i <mCrimes.size(); i++){
if(mCrimes.get(i).getId().equaLs(crimeId)){
mViewPager.setCurrentItem(i); break;}
}
}
}
运行CriminalIntent应用。选择任意列表项,其对应的Crime明细应该能够显示了。现在, ViewPager的使用配置已完成,可以投入使用了。