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

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

/*
* 功能:改进滑动页面效果
* 作者:刘慧超
* 时间:2015年11月16日01:18:07
* */
public class Main2Activity extends AppCompatActivity {

    ViewPager pager=null;
    PagerTabStrip tabStrip=null;
    ArrayList<View> viewContainter=new ArrayList<View>();//tab对应的视图
    ArrayList<String> titleContainer=new ArrayList<String>(){};//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<View> viewContainter;//tab对应的视图
        private ArrayList<String> titleContainer;//tab的标题

        /*
        * construction Function
        *   传入view跟title数组
        * */
        public TestPagerAdapter(ArrayList<View> viewContainter,ArrayList<String> 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!

        返回值:返回一个代表新增视图页面的Object(Key),这里没必要非要返回视图本身,
            也可以这个页面的其它容器。其实我的理解是可以代表当前页面的任意值,
            只要你可以与你增加的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:

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

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

好吧,继续改动!!!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-30 09:25:00

ViewPager+PagerTabStrip实现页面选项卡滑动的相关文章

android ViewPager页面左右滑动切换

我们日常生活中用到的微博,QQ,微信等app在进行页面左右滑动的时候,很多都可以用ViewPager来实现.可以说,ViewPager在android开发中十分常见并且特别实用. Viewpager在android.support.v4.view这个软件包中, android.support.v4.view.jar是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.所以低版本开发时必须加入android-support-v4.jar,并且在XML

自定义View 之利用ViewPager 实现画廊效果(滑动放大缩小)

自定义View 之利用ViewPager 实现画廊效果(滑动放大缩小) 转载请标明出处: http://blog.csdn.net/lisdye2/article/details/52315008 本文出自:[Alex_MaHao的博客] 项目中的源码已经共享到github,有需要者请移步[Alex_MaHao的github] 基本介绍 画廊在很多的App设计中都有,如下图所示: 该例子是我没事的时候写的一个小项目,具体源码地址请访问https://github.com/AlexSmille/Y

Android 使用ViewPager真正实现左右无限滑动(附源码)

前言 网上有很多使用ViewPager实现左右滑动这一效果的资料,这些资料大多数都是将PagerAdapter中getCount()方法的返回值设为Integer.MAX_VALUE使用户看不到边界,然后在instantiateItem()方法中通过position%(要循环显示的数据集的长度)的方式取得对应的数据集.这样虽然可以做到无限循环,但是会有两个弊端:首先会创建大量对象,容易引起内存溢出(循环加载图片)从而影响性能:其次从第一页向右滑动的时候是无法滑动的. 今天给大家分享的是另一种实现

Android典型界面设计(7) ——DrawerLayout+Fragement+ViewPager+PagerTabStrip实现双导航

一.问题描述 在Android典型界面设计(3)的我们实现了双导航效果,即外层底部导航和内部区域的头部导航,如网易新闻等很多应用采用了这种导航,但Google提供DrawerLayout可实现抽屉式导航,建议使用DrawerLayout代替底部导航,下面我们就使用官方提供的DrawerLayout+Fragement+ViewPager+PagerTabStrip实现下图效果: 二.本例相关技术 1. DrawerLayout 抽屉式导航 2. Fragment管理 3. ViewPager和P

ViewFlipper 在同一背景下 页面左右滑动

<ViewFlipper android:id="@+id/ViewFlipper1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:inAnimation="@anim/push_left_in" android:outAnimation="@anim/push_left_out" >

(一)html5 touch事件实现页面上下滑动

最近做的做那个app的项目由于用overflow:hidden导致了很多问题,于是决定研究下html5的touch事件.想找个全面点的帖子真是难死了,虽然好多关于html5 touch的文章但大多都是介绍touch事件或者很简短的小demo. 下午好生研究了下终于搞出了个比较全面的上下滑动的小demo,代码比较简单. 下面是完整代码,我把几个重要的地方做了红色标记 <!doctype html> <html lang="en"> <head> <

Android屏幕页面的滑动切换和抽取父类

因为页面的滑动效果在整个应用中使用较多,所有抽取成父类来介绍,看代码注释 import android.app.Activity; import android.content.SharedPreferences; import android.os.Bundle; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.

jQuery实现页面底部滑动置顶

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>jQuery实现页面底部滑动置顶 | alleyloft.com</title> <link type="text/css" rel="stylesheet" href="css/main.css" /> <script

小程序页面禁止滑动

要做一个弹窗功能,弹窗是可以拖拽的,而且弹窗里的元素是有bindtap事件的,在弹窗使用了bindtouchstart之后发现弹窗拖拽的同时背景也在滑动,改为使用了catchtouchstart之后背景不滑动了,但是发现子元素 的bindtap事件无法执行,于是又改为了bindtouchstart,换一种思路,选择另一种方法就是如何让页面禁止滑动,只需要加上下边的代码到本页json文件就可以了 , 在开发时候会遇到这个页面在安卓手机上不会滑动,但是在苹果手机上会上下滑动,体验不是很好,只需要在当