您的位置:首页 > 移动开发 > Android开发

Android笔记之ViewPager实现滑动页面

2013-09-24 20:24 351 查看
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作为填充内容:

privatevoidinitViewPager(){
//TODOAuto-generatedmethodstub
pager=(ViewPager)findViewById(R.id.Pager);
LayoutParamsparams=newLayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT);
ImageViewimaV;
for(inti=0;i<ids.length;i++){
imaV=newImageView(this);
imaV.setImageResource(ids[i]);

imaV.setLayoutParams(params);
imaV.setScaleType(ScaleType.FIT_XY);
views.add(imaV);
}
pager.setAdapter(newMyAdapter(views));
}
publicclassMyAdapterextendsPagerAdapter{

privateList<View>views;

publicMyAdapter(List<View>views){
this.views=views;
}

//destroyItem,getCount,instantiateItem实现循环滑动
@Override
publicvoiddestroyItem(Viewarg0,intarg1,Objectarg2){
((ViewPager)arg0).removeView(views.get(arg1%views.size()));
}

@Override
publicintgetCount(){
returnviews.size();
//向右循环滑动
//returnviews.size()*5;
}

@Override
publicObjectinstantiateItem(Viewarg0,intarg1){
Log.e("tag","instantiateItem="+arg1);
((ViewPager)arg0).addView(views.get(arg1%views.size()),0);
returnviews.get(arg1%views.size());
}

@Override
publicbooleanisViewFromObject(Viewarg0,Objectarg1){
returnarg0==(arg1);
}

}


(2)fragment作为填充内容:

FragmentActivity或Fragment下

fragment_1extendFragment

privateViewPagerpager;
pager=(ViewPager)findViewById(R.id.Pager);

fragmentList.add(newfragment_1());//fragment_1导入v4的包
fragmentList.add(newfragment_1());
fragmentList.add(newfragment_1());
Log.i("size",fragmentList.size()+"");
MyAdaptermyadapter=newMyAdapter(getSupportFragmentManager(),
fragmentList);
pager.setAdapter(myadapter);
}
publicclassMyAdapterextendsFragmentStatePagerAdapter{
List<Fragment>fragmentList;

//构造函数
publicMyAdapter(FragmentManagerfm,List<Fragment>fragmentList){
super(fm);
//TODOAuto-generatedconstructorstub
this.fragmentList=fragmentList;
}

//重要
@Override
publicFragmentgetItem(intarg0){
//TODOAuto-generatedmethodstub
Log.i("getItem",arg0+"");
return(fragmentList==null||fragmentList.size()==0)?null
:fragmentList.get(arg0);
}

//重要
@Override
publicintgetCount(){
//TODOAuto-generatedmethodstub
returnfragmentList==null?0:fragmentList.size();
}
}
}


4、决定是否为ViewPager设置监听:每次切换页面的动作

pager.setOnPageChangeListener(newOnPageChangeListener(){

/**
*onPageSelected:每次切换页面就会执行在此实现圆点指示器以及在最后页面显示button
*/
@Override
publicvoidonPageSelected(intarg0){
//TODOAuto-generatedmethodstub
}
/**
*当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法回得到调用。其中三个参数的含义分别为:
*
*arg0:当前页面,及你点击滑动的页面
*
*arg1:当前页面偏移的百分比
*
*arg2:当前页面偏移的像素位置
*/
@Override
publicvoidonPageScrolled(intarg0,floatarg1,intarg2){
//TODOAuto-generatedmethodstub
if(arg0==views.size()-1){
Log.i("jump","NextActivity");
startActivity(newIntent().setClass(MainActivity.this,
NextActivity.class));
finish();
Log.i("finished","MainActivity");
}
}

@Override
publicvoidonPageScrollStateChanged(intarg0){
//TODOAuto-generatedmethodstub
}
});


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>


代码部分:适配器需要添加privateList<String>titleList作为标题字符串集合

classmyPagerAdapterextendsFragmentPagerAdapter{
privateList<Fragment>fragmentList;
privateList<String>titleList;

publicmyPagerAdapter(FragmentManagerfm,List<Fragment>fragmentList,List<String>titleList){
super(fm);
this.fragmentList=fragmentList;
//this.fragmentList为这个类下的变量,右边的fragmentList是构造函数的参数
this.titleList=titleList;
}
.........

publicCharSequencegetPageTitle(intposition){
return(titleList.size()>position)?titleList.get(position):"";
}



(2)监听onPageChanggeListener改变Textiew或RadioGroup的状态:

Textiew,Radioroup的触碰效果通过selector实现

按textView、RadioGroup改变页面,通过对其setOnClickListener实现

页面滑动改变对应按钮的改变通过Viewpager的监听

附加:图片指示器的实现只需在Viewpager监听实现

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