您的位置:首页 > 其它

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

2015-11-16 01:26 176 查看
经过一个简单的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:左右滑动的时候标题不固定。

好吧,继续改动!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: