1、概述;
- Viewpager的最大特点就是实现滑动的界面
- 多个页面的内容可以有两种填充方式:View (普通Activity下),Fragment(V4的Fragmentctivity或者Fragment下)
- ViewPager的布局最好是在LinearLayout下写
2、main.xml添加Viewpager组件:
<android.support.v4.view.ViewPager android:id="@+id/Pager" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" > </android.support.v4.view.ViewPager>
3、主要代码的步骤:
实例化Viewpager+获得ArrayList作为填充内容+setAdapter(ArrayList....)+新建类extends (FragmentState)PagerAdapter
+重写适配器的Constructor、getItem、getCount+根据情况决定是否监听onPageChangeListener
(1)Views作为填充内容:
private void initViewPager() { // TODO Auto-generated method stub pager = (ViewPager) findViewById(R.id.Pager); LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); ImageView imaV; for (int i = 0; i < ids.length; i++) { imaV = new ImageView(this); imaV.setImageResource(ids[i]); imaV.setLayoutParams(params); imaV.setScaleType(ScaleType.FIT_XY); views.add(imaV); } pager.setAdapter(new MyAdapter(views)); } public class MyAdapter extends PagerAdapter { private List<View> views; public MyAdapter(List<View> views) { this.views = views; } //destroyItem,getCount,instantiateItem实现循环滑动 @Override public void destroyItem(View arg0, int arg1, Object arg2) { ((ViewPager) arg0).removeView(views.get(arg1 % views.size())); } @Override public int getCount() { return views.size(); //向右循环滑动 //return views.size()*5; } @Override public Object instantiateItem(View arg0, int arg1) { Log.e("tag", "instantiateItem = " + arg1); ((ViewPager) arg0).addView(views.get(arg1 % views.size()), 0); return views.get(arg1 % views.size()); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == (arg1); } }
(2)fragment作为填充内容:
- FragmentActivity或Fragment下
- fragment_1 extend Fragment
private ViewPager pager; pager = (ViewPager) findViewById(R.id.Pager); fragmentList.add(new fragment_1());// fragment_1导入v4的包 fragmentList.add(new fragment_1()); fragmentList.add(new fragment_1()); Log.i("size", fragmentList.size() + ""); MyAdapter myadapter = new MyAdapter(getSupportFragmentManager(), fragmentList); pager.setAdapter(myadapter); } public class MyAdapter extends FragmentStatePagerAdapter { List<Fragment> fragmentList; // 构造函数 public MyAdapter(FragmentManager fm, List<Fragment> fragmentList) { super(fm); // TODO Auto-generated constructor stub this.fragmentList = fragmentList; } // 重要 @Override public Fragment getItem(int arg0) { // TODO Auto-generated method stub Log.i("getItem", arg0 + ""); return (fragmentList == null || fragmentList.size() == 0) ? null : fragmentList.get(arg0); } // 重要 @Override public int getCount() { // TODO Auto-generated method stub return fragmentList == null ? 0 : fragmentList.size(); } } }
4、决定是否为ViewPager设置监听:每次切换页面的动作
pager.setOnPageChangeListener(new OnPageChangeListener() { /** * onPageSelected:每次切换页面就会执行 在此实现圆点指示器以及在最后页面显示button */ @Override public void onPageSelected(int arg0) { // TODO Auto-generated method stub } /** * 当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法回得到调用。 其中三个参数的含义分别为: * * arg0 :当前页面,及你点击滑动的页面 * * arg1:当前页面偏移的百分比 * * arg2:当前页面偏移的像素位置 */ @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub if (arg0 == views.size() - 1) { Log.i("jump", "NextActivity"); startActivity(new Intent().setClass(MainActivity.this, NextActivity.class)); finish(); Log.i("finished", "MainActivity"); } } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } });
5、为ViewPager添加标题
一般情况下ViewPager在多个页面下都是需要标题来作为指示的
标题有两种形式:
(1)使用view.PagerTabStrip 来匹配各个页面:
main.xml部分:
<android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" > <android.support.v4.view.PagerTabStrip android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top" /> </android.support.v4.view.ViewPager>
代码部分:适配器需要添加private List<String> titleList作为标题字符串集合
class myPagerAdapter extends FragmentPagerAdapter { private List<Fragment> fragmentList; private List<String> titleList; public myPagerAdapter(FragmentManager fm, List<Fragment> fragmentList, List<String> titleList){ super(fm); this.fragmentList = fragmentList; //this.fragmentList为这个类下的变量,右边的fragmentList是构造函数的参数 this.titleList = titleList; }
.........
public CharSequence getPageTitle(int position) { return (titleList.size() > position) ? titleList.get(position) : ""; }
(2)监听onPageChanggeListener改变Textiew或RadioGroup的状态:
- Textiew,Radioroup的触碰效果通过selector实现
- 按textView、RadioGroup改变页面,通过对其setOnClickListener实现
- 页面滑动改变对应按钮的改变通过Viewpager的监听
- 附加:图片指示器的实现只需在Viewpager监听实现
Done!