本章介绍了ViewPager,所谓ViewPager,如下图:
实际实现ViewPager的过程非常简单,就是将Fragment 托管给一个Activity的布局文件,且该布局文件中的组件就是ViewPager。在本例中,就是将CrimePagerActivity替换了之前的CrimeActivity,并创建相应的activity_crime_pager.xml
在CrimePagerActivity中,我们所需要做的主要任务就是将model层的数据托管给ViewPager。这部分的代码是由mViewPager.setAdapter完成的。
考虑到,在Crimlist中点击数据,再将数据传导给CrimePagerActivity。所以要考虑到数据再CrimePagerActivity中的流转
public class CrimePagerActivity extends AppCompatActivity {
private static final String EXTRA_CRIME_ID=
"com..........crime_id";
private ViewPager mViewPager;
private List<Crmie> mCrimes;
public static Intent newIntent(Context packageContext,UUID crimeId){
Intent intent= new Intent(packageContext,CrimePagerActivity.class);
intent.putExtra(EXTRA_CRIME_ID,crimeId);
return intent;
}//公共方法,以便给其它类调用传值。(在CrimeListFragment)
@Override
protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
setContentView(R.layout.activity_crime_pager);
UUID crimeId = (UUID) getIntent()
.getSerializableExtra(EXTRA_CRIME_ID);
//获取值
mViewPager=(ViewPager)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(positon);
return CrimeFragment.newInstance(crime.getId());
//注意这里返回的CrimeFragment,是调用了CrimeFragment.newInstance。
//这里有传值操作需要注意。
}
@Override
public int getCount(){
return mCrimes.size();
});
}
for(int i=0;i<mCrimes.size();i++){
if(mCrimes.get(i).getId().equals(crimeId)){
mViewPager.setCurrentItem(i);
break;
}
}
}
}
这里要特别注意,这里是ViewPager中的Adapter 启用了CrimeFragment,是在getItem中去启动CrimeFragment,而ViewPager默认于第一个值,所以想要CrimeLsit中所点击的项显示在接下来的页面,就需要以上的代码中的for循环。
挑战练习:
第一题主要由于ViewPage默认无边距,需要设置一下边距
mViewPager.setPageMargin((int) getResources().getDimensionPixelOffset()
//设置编剧代码
第二题是本章节的重点,需要从两个方面考虑,一个是需要重现布局文件,再一个是对Activity进行编码。
布局文件:
需要更改activity_crime_pager.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.viewpager.widget.ViewPager
android:id="@+id/activity_crime_pager_view_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="52dp"
android:layout_gravity="bottom">
<Button
android:id="@+id/Button_JumpToFirst"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left|bottom"
android:text="FirstPage" />
<Button
android:id="@+id/Button_JumpToLast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|bottom"
android:text="LastPage" />
</FrameLayout>
</FrameLayout>
这里要注意一点,我是使用了FrameLaout布局。如果使用LinearLayout布局,ViewPage会自动占满整个屏幕,需要设置layout_weight权重来保证布局完整。
Activity的编写:
1.Button监听器设置:
mJumpFirstButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mViewPager.setCurrentItem(0);
}
});
mJumpLastButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mViewPager.setCurrentItem(mCrimes.size()-1);
}
});
2.Page监听器设置
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if (position==0)
mJumpFirstButton.setEnabled(false);
else if(position==mCrimes.size()-1)
mJumpLastButton.setEnabled(false);
else
mJumpFirstButton.setEnabled(true);
mJumpLastButton.setEnabled(true);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
3.初始页面,按钮初始化
for ( int i =0;i<mCrimes.size();i++){
if (mCrimes.get(i).getId().equals(crimeId)){
mViewPager.setCurrentItem(i);
if (i==0)
mJumpFirstButton.setEnabled(false);
if(i==mCrimes.size()-1)
mJumpLastButton.setEnabled(false);
break;
}
}
Page会自动默认加载初始项,所以需要对第一个页面和最后一个页面进行初始化。