一开始接触ViewPager
有一种懵逼的感觉,不是很清楚ViewPager
是如何工作的,后来嘛。。。还是看下去吧
适配器:
`ViewPager` 对应的适配器:`PagerAdapter`
滑动监听
①滑动方向:左右滑动
②滑动监听:addOnPageChangeListener
代码设置选中项
setCurrentItem
下面就开始正式讲一下ViewPager
的使用了
PagerAdapter
(PageView
的适配器)
PagerAdapter
有四大函数,如想实现正常界面滑动,那么在Adapter
里就必须实现这四大函数
下面结合demo讲解:
PagerAdapter mPagerAdapter = new PagerAdapter() {
@Override
public int getCount() {
//View的count
return mViewList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
//object为instantiateItem return的Object对象
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mViewList.get(position));
return mViewList.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mViewList.get(position));
}
};
函数一:
getCount()
这个方法在
ListView
的Adapter
中我们也见过,返回的是item
的总数量,在PagerAdapter
也是一样,返回的是要滑动的View
的总数量函数二:
isViewFromObject
这个函数通过比较
View
来判断显示的是否是同一张图片,此函数的object
参数为instantiateItem
函数的返回值函数三:
instantiateItem
这个函数主要用了两件事,①将当前视图添加到
container
中,②返回当前View
函数四:
destroyItem
这个函数从当前
container
中删除指定位置(position
)的View
拓展:
PagerTitleStrip
、PagerTabStrip
这两个控件的主要作用是给滑动的界面添加标题,如下图所示:
demo:以 PagerTitleStrip 为例:在xml中,控件嵌套位置
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="300dp">
<android.support.v4.view.PagerTitleStrip
android:id="@+id/pager_strip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</android.support.v4.view.ViewPager>
展示标题 : 除重写四个必要函数外,还需重写getPageTitle( )
方法
PagerAdapter mPagerAdapter = new PagerAdapter() {
@Override
public int getCount() {
//View的count
return mViewList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
//object为instantiateItem return的Object对象
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mViewList.get(position));
return mViewList.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mViewList.get(position));
}
@Override
public CharSequence getPageTitle(int position) { //只是显示标题,非必须实现方法
return mTitleList.get(position);
}
};
PagerTabStrip
和PagerTitleStrip
的实现代码是一样的,同样需要重写getPageTitle( )
方法
除此之外,两者的主要区别为PagerTabStrip
可点击tab标题进行切换页面
下面还有两个方法,可用于优化界面UI:
①每个界面只显示一个标题
mTitleStrip = (PagerTitleStrip) findViewById(R.id.pager_strip);
mTitleStrip.getChildAt(0).setVisibility(View.GONE);
mTitleStrip.getChildAt(2).setVisibility(View.GONE);
②改变PagerTabStrip
下划线颜色
mTabStrip.setTabIndicatorColorResource(R.color.green); //改变标题下划线颜色
以上,基础已经了解了,下面我们就该来看看ViewPager
最常用的方式,即和Fragment
结合使用
ViewPager
和Fragment
ViewPager
和Fragment
结合使用时,常用的适配器:FragmentPagerAdapter
public class FragmentAdapter extends FragmentPagerAdapter {
private List<Fragment> mFragments;
public FragmentAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
mFragments = fragments;
}
@Override
public Fragment getItem(int arg0) {
return mFragments.get(arg0);
}
@Override
public int getCount() {
return mFragments.size();
}
}
继承FragmentPagerAdapter
,只重写getItem(int)
和getCount()
方法,这两个方法在ListView
也是经常见到的,具体什么含义就不解释了
构造适配器:
mViewPager = (ViewPager) findViewById(R.id.viewPager);
mFragmentList = new ArrayList<>();
Fragment1 fragment1 = new Fragment1();
Fragment2 fragment2 = new Fragment2();
Fragment3 fragment3 = new Fragment3();
mFragmentList.add(fragment1);
mFragmentList.add(fragment2);
mFragmentList.add(fragment3);
mViewPager.setAdapter(new FragmentAdapter(getSupportFragmentManager(), mFragmentList));
滑动监听:mViewPager.addOnPageChangeListener(new MyPageChangeListener());
public class MyPageChangeListener implements ViewPager.OnPageChangeListener {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
/**
* 这个方法会在屏幕滚动过程中不断被调用。
*/
}
@Override
public void onPageSelected(int position) {
/**
* 当用手指滑动翻页的时候,如果翻动成功了(滑动的距离够长),
*
* 手指抬起来就会立即执行这个方法,position就是当前滑动到的页面。
*/
Toast.makeText(FragmentPagerAct.this, "翻到了第" + (position + 1) + "页", Toast.LENGTH_SHORT).show();
}
@Override
public void onPageScrollStateChanged(int state) {
/**
* 这个方法在手指操作屏幕的时候发生变化。有三个值:0(END),1(PRESS) , 2(UP)
*
* 当用手指滑动翻页时,手指按下去的时候会触发这个方法,state值为1
*
* 手指抬起时,如果发生了滑动(即使很小),这个值会变为2,然后最后变为0
*/
}
}
以上,即为ViewPager
和Fragment
结合使用时,常用的方法,其中需要注意的是
mViewPager.setAdapter(new FragmentAdapter(getSupportFragmentManager(), mFragmentList));
内嵌的Fragment
需和ViewPager
所处Activity
导入的包一致
例如:如果使用了v4
包下的Fragemnt
,那么ViewPager
所处当前Class
必须继承FragmentActivity
,获取Fragment管理器的方法是getSupportFragmentManager()。
如果使用了app
包下的Fragemnt
,那么`ViewPager
所处当前Class
直接继承Activity
即可,获取Fragment管理器的方法是getFragmentManager()。
不过我们大多数使用的都是v4
包下的Fragemnt
。
完整Demo代码:点击这里