Android笔记之ViewPager实现滑动页面

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!

 

posted @ 2013-09-24 20:24  行云有影  阅读(612)  评论(0编辑  收藏  举报