经过一个简单的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:左右滑动的时候标题不固定。
好吧,继续改动!!!