- 活动布局文件中写入ViewPager,PagerTabStrip
- 准备几个页卡布局
- 创建适配器
- 在活动中动态加载进View页卡布局并存入List (作为ViewPagerAdapter的实参)
- 给viewPager set adapter
//activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context="com.example.a6100890.viewpagertest.MainActivity">
<android.support.v4.view.ViewPager
android:layout_gravity="center"
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</android.support.v4.view.ViewPager>
</LinearLayout>public class MyViewPagerAdapter extends PagerAdapter {
private List<View> mListViews;
public MyViewPagerAdapter(List<View> mListViews){
this.mListViews = mListViews;
}
@Override
//删除页卡
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mListViews.get(position));
}
@Override
//实例化页卡
public Object instantiateItem(ViewGroup container, int position) {
//在container中加入view
container.addView(mListViews.get(position));
return mListViews.get(position);
}
@Override
public int getCount() {
return mListViews.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}public class MainActivity extends AppCompatActivity {
private View view1,view2;
private List<View> views;
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViewPager();
}
private void initViewPager(){
viewPager = (ViewPager) findViewById(R.id.viewpager);
views = new ArrayList<>();
//动态加载view
LayoutInflater inflater = getLayoutInflater();
view1 = inflater.inflate(R.layout.pager_1, null);
view2 = inflater.inflate(R.layout.pager_2, null);
views.add(view1);
views.add(view2);
viewPager.setAdapter(new MyViewPagerAdapter(views));
}
}-
标题栏作为ViewPager的子布局
-
通过重写适配器的getPageTitle(int)方法来获取标题栏
-
把PagerTitleStrip作为子控件设置在PagerView中
-
在活动、适配器中分别定义一个List
存放标题,从活动中传入适配器构造
-
重写getPageTitle(int)
<android.support.v4.view.ViewPager
android:layout_gravity="center"
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<android.support.v4.view.PagerTitleStrip
android:layout_gravity="top"
android:id="@+id/pager_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</android.support.v4.view.ViewPager>//MainActivity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
titles = new ArrayList<>();
titles.add("a");
titles.add("b");
initViewPager();
}//Adapter
public MyViewPagerAdapter(List<View> mListViews,List<String> titles){
this.mListViews = mListViews;
this.titles = titles;
}
@Override
public CharSequence getPageTitle(int position) {
return titles.get(position);
}- 用法同上
- 唯一区别:是否可点击与下划线指示条
FragmetnStatePagerAdapter和FragmentPagerAdapter- 区别在于前者会销毁不需要的fragment,state表示可在onSaveInstanceState(Bundle)中保存fragment的Bundle信息,后者创建的fragment永远不会被销毁,只是销毁视图
- 前者用于大量fragment数据情况,可节约内存。后者用于少量的fragment
//onCreate
mViewPager = (ViewPager) findViewById(R.id.activity_crime_pager_view_pager);
mCrimes = CrimeLab.get(this).getCrimes(); //List<Crime> mCrimes
FragmentManager fragmentManager = getSupportFragmentManager();
mViewPager.setAdapter(new FragmentPagerAdapter(fragmentManager) {
@Override
public Fragment getItem(int position) {
//用于托管特定fragment
Crime crime = mCrimes.get(position);
return CrimeFragment.newInstance(crime.getId());
}
@Override
public int getCount() {
return mCrimes.size();
}
});
//让viewPager加载完成时显示某特定页
for (int i = 0; i < mCrimes.size(); i++) {
if (mCrimes.get(i).getId().equals(crimeId)) {
mViewPager.setCurrentItem(i);
//break!
break;
}
}