ViewPager+PagerTabStrip实现页面选项卡滑动



            经过一个简单的Demo,基本上做出了个可以实现功能的滑动页面,但是这个东西复用性差,而且还有一些小bug,不喜欢,再改!


      

/*
* 功能:改进滑动页面效果
* 作者:刘慧超
* 时间:2015111601:18:07
* */
public class Main2Activity extends AppCompatActivity {

    ViewPager pager=null;
    PagerTabStrip tabStrip=null;
    ArrayList viewContainter=new ArrayList();//tab对应的视图
    ArrayList titleContainer=new ArrayList(){};//tab的标题

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_main2);

        pager=(ViewPager)findViewById(R.id.viewpagerTwo);
        tabStrip=(PagerTabStrip)this.findViewById(R.id.tabstripTwo);

        View view1= LayoutInflater.from(this).inflate(R.layout.tab1,null);
        View view2=LayoutInflater.from(this).inflate(R.layout.tab2,null);
        View view3=LayoutInflater.from(this).inflate(R.layout.tab3,null);
        //ViewPager开始添加View
        viewContainter.add(view1);
        viewContainter.add(view2);
        viewContainter.add(view3);
        //页签项
        titleContainer.add("第一项");
        titleContainer.add("第二项");
        titleContainer.add("第三项");
        pager.setAdapter(new TestPagerAdapter(viewContainter, titleContainer));
        pager.setOnPageChangeListener(new TestOnPageChangeListener());
    }


    /*继承OnPageChangeListener*/
    public class TestOnPageChangeListener implements ViewPager.OnPageChangeListener {

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            switch (position){
                case 0:
                    Toast.makeText(getBaseContext(),"当前position为:"+position,Toast.LENGTH_SHORT).show();
                    break;
                case 1:
                    Toast.makeText(getBaseContext(),"当前position为:"+position,Toast.LENGTH_SHORT).show();
                    break;
                case 2:
                    Toast.makeText(getBaseContext(),"当前position为:"+position,Toast.LENGTH_SHORT).show();
                    break;
            }
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    }

    /*继承PagerAdapter */
    public class TestPagerAdapter extends PagerAdapter{

        private ArrayList viewContainter;//tab对应的视图
        private ArrayList titleContainer;//tab的标题

        /*
        * construction Function
        *   传入viewtitle数组
        * */
        public TestPagerAdapter(ArrayList viewContainter,ArrayList titleContainer){
            this.viewContainter=viewContainter;
            this.titleContainer=titleContainer;
        }
        /*
             * viewpager中组件数量
             * */
        @Override
        public int getCount() {
            return viewContainter.size();
        }

        /*
        * 初始化item
        *   做了两件事,第一:将当前视图添加到container中,第二:返回当前View
        *
        *   这个函数的实现的功能是创建指定位置的页面视图。
        *   适配器有责任增加即将创建的View视图到这里给定的container中,
        *   这是为了确保在finishUpdate(viewGroup)返回时this is be done!

        返回值:返回一个代表新增视图页面的ObjectKey),这里没必要非要返回视图本身,
            也可以这个页面的其它容器。其实我的理解是可以代表当前页面的任意值,
            只要你可以与你增加的View一一对应即可,比如position变量也可以做为Key
        * */
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            ((ViewPager) container).addView(viewContainter.get(position));
            return viewContainter.get(position);
        }

        /*滑动切换的时候销毁当前组件
        *   从当前container中删除指定位置(position)的View;
        * */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            ((ViewPager) container).removeView(viewContainter.get(position));
        }

        /*
        * */
        @Override
        public int getItemPosition(Object object) {
            return super.getItemPosition(object);
        }

        /*为每个页面提供页面标题*/
        @Override
        public CharSequence getPageTitle(int position) {
            return titleContainer.get(position);
        }

        /*
        * 该函数用来判断instantiateItem(ViewGroup, int)
        *   函数所返回来的Key与一个页面视图是否是代表的同一个视图(即它俩是否是对应的,对应的表示同一个View)
        *
        *返回值:如果对应的是同一个View,返回True,否则返回False
        * */
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;  //官方提示这样写
        }
    }
}



       通过重写继承OnPageChangeListener跟PagerAdapter,将一些重复性代码放到这两个类里面,在onCreate里面只需要加入一些初始化的方法即可,但是感觉还有一些小bug:


      ViewPager+PagerTabStrip实现页面选项卡滑动_第1张图片


Bug1,刚进入到应用里面,标题没有显示出来。

Bug2:左右滑动的时候标题不固定。


好吧,继续改动!!!







你可能感兴趣的:(ViewPager+PagerTabStrip实现页面选项卡滑动)