AndroidViewPager的使用总结
2015-10-24 19:40:19 | 来源:玩转帮会 | 投稿:佚名 | 编辑:小柯

原标题:AndroidViewPager的使用总结

在一个窗口里面添加tab便签,完成便签切换来实现页面的切换,这样的好处是可以在同一个窗口里面有多个页面,这些页面共享同一个窗口的照片,同使用多个窗口来实现这个功能来得更加流畅!!

主要产生的类文件有activity,n个view,adapter,自定义的ViewPager,n+1个布局文件

demo所用到文件

Android ViewPager 的使用总结 - 技术文摘 | 玩赚乐 1

Android ViewPager 的使用总结 - 技术文摘 | 玩赚乐 2

步骤:

创建activity

packagecom.example.myviewpager;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.graphics.Color;
importandroid.os.Bundle;
importandroid.support.v4.view.ViewPager;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.TextView;
/**
*主窗口
*@authorcgx
*
*/
publicclassMainActivityextendsActivityimplementsOnClickListener{
	privateContextmContext;
	privateMyViewPagermPager;//页面内容
	privateMyViewPagerAdapterpagerAdapter=null;
	privateTextViewt1,t2,t3;//页卡头标
	privateList<View>pageList=newArrayList<View>();
	privateView1mView1;
	privateView2mView2;
	privateView3mView3;
	@Override
	protectedvoidonCreate(BundlesavedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mContext=this;
		initViews();
		initEvents();
		initViewPager();
	}
	privatevoidinitViews(){
		//TODOAuto-generatedmethodstub
		t1=(TextView)findViewById(R.id.text1);
		t2=(TextView)findViewById(R.id.text2);
		t3=(TextView)findViewById(R.id.text3);
		mPager=(MyViewPager)findViewById(R.id.vPager);
		//设置ViewPager不允许滑动
		//mPager.setCanScroll(false);
		//一开始进入窗口的时候,默认第一个便签被选中
		t1.setBackgroundColor(Color.parseColor("#FFFF00"));
		t2.setBackgroundColor(Color.parseColor("#FFFFFF"));
		t3.setBackgroundColor(Color.parseColor("#FFFFFF"));
	}
	privatevoidinitEvents(){
		//TODOAuto-generatedmethodstub
		t1.setOnClickListener(this);
		t2.setOnClickListener(this);
		t3.setOnClickListener(this);
	}
	privatevoidinitViewPager(){
		//TODOAuto-generatedmethodstub
		pageList.clear();
		if(mView1==null){
			mView1=newView1(mContext);
		}
		if(mView2==null){
			mView2=newView2(mContext);
		}
		if(mView3==null){
			mView3=newView3(mContext);
		}
		pageList.add(mView1.getView());
		pageList.add(mView2.getView());
		pageList.add(mView3.getView());
		pagerAdapter=newMyViewPagerAdapter(pageList);
		//缓存页面,如果想全部都缓存的话,参数等于页卡数减一,系统默认参数为1,保存两个
		mPager.setOffscreenPageLimit(2);
		mPager.setAdapter(pagerAdapter);
		//设置Page改变监听器
		mPager.setOnPageChangeListener(onPageChangeListener);
	}
	/**
	*SimpleOnPageChangeListener.该监听是当我们的viewpager页面切换的时候会触发在里面我们会去改变tab的聚焦情况
	*。因为实现上viewpager与actionbar是独立的,需要我们手动同步。
	*/
	ViewPager.SimpleOnPageChangeListeneronPageChangeListener=newViewPager.SimpleOnPageChangeListener(){
		@Override
		publicvoidonPageSelected(intposition){
			/**
			*setSelectedNavigationItem方法用于设置ActionBar的聚焦tab.
			*在接下来我们判断了SLidingMenu的手势力模式,如果ViewPager已经滑到了最左边,则我们把手势设置成全屏的,
			*这样更往左滑动的时候,就会打开Menu.
			*/
			initTab(position);
		}
		//初始化便签颜色
		privatevoidinitTab(intposition){
			//TODOAuto-generatedmethodstub
			if(position==0){
				t1.setBackgroundColor(Color.parseColor("#FFFF00"));
				t2.setBackgroundColor(Color.parseColor("#FFFFFF"));
				t3.setBackgroundColor(Color.parseColor("#FFFFFF"));
			}elseif(position==1){
				t1.setBackgroundColor(Color.parseColor("#FFFFFF"));
				t2.setBackgroundColor(Color.parseColor("#FFFF00"));
				t3.setBackgroundColor(Color.parseColor("#FFFFFF"));
			}else{
				t1.setBackgroundColor(Color.parseColor("#FFFFFF"));
				t2.setBackgroundColor(Color.parseColor("#FFFFFF"));
				t3.setBackgroundColor(Color.parseColor("#FFFF00"));
			}
		}
	};
	@Override
	publicvoidonClick(Viewv){
		//TODOAuto-generatedmethodstub
		switch(v.getId()){
		caseR.id.text1://点击第一个便签
			mPager.setCurrentItem(0,false);
			break;
		caseR.id.text2://点击第二个便签
			mPager.setCurrentItem(1,false);
			break;
		caseR.id.text3://点击第三个便签
			mPager.setCurrentItem(2,false);
			break;
		default:
			break;
		}
	}
}

自定义MyViewPager

packagecom.example.myviewpager;
importandroid.content.Context;
importandroid.support.v4.view.ViewPager;
importandroid.util.AttributeSet;
importandroid.view.MotionEvent;
/**
*自定义滑动翻页可控,可通过设置isCanScroll参数来控制是否允许滑动切换页面
*/
publicclassMyViewPagerextendsViewPager{
	/**是否允许滑动翻页,默认可滑动*/
	privatebooleanisCanScroll=true;
	publicMyViewPager(Contextcontext,AttributeSetattrs){
		super(context,attrs);
	}
	publicMyViewPager(Contextcontext){
		super(context);
	}
	publicbooleanisCanScroll(){
		returnisCanScroll;
	}
	/**设置是否可以滑动翻页*/
	publicvoidsetCanScroll(booleanisCanScroll){
		this.isCanScroll=isCanScroll;
	}
	@Override
	publicvoidscrollTo(intx,inty){
		super.scrollTo(x,y);
	}
	//设置禁止滑动的关键
	@Override
	publicbooleanonTouchEvent(MotionEventarg0){
		if(!isCanScroll)
			returntrue;
		returnsuper.onTouchEvent(arg0);
	}
	@Override
	publicbooleanonInterceptTouchEvent(MotionEventarg0){
		returnsuper.onInterceptTouchEvent(arg0);
	}
	@Override
	publicvoidsetCurrentItem(intitem,booleansmoothScroll){
		super.setCurrentItem(item,smoothScroll);
	}
	@Override
	publicvoidsetCurrentItem(intitem){
		super.setCurrentItem(item);
	}
}

适配器:

packagecom.example.myviewpager;
importjava.util.List;
importandroid.support.v4.view.PagerAdapter;
importandroid.view.View;
importandroid.view.ViewGroup;
/**
*viewpager适配器
**/
publicclassMyViewPagerAdapterextendsPagerAdapter{
privateList<View>mListViews;
publicMyViewPagerAdapter(List<View>mListViews){
this.mListViews=mListViews;//构造方法,参数是我们的页卡,这样比较方便
}
@Override
publicvoiddestroyItem(ViewGroupcontainer,intposition,Objectobject){
container.removeView(mListViews.get(position));//删除页卡
}
@Override
publicObjectinstantiateItem(ViewGroupcontainer,intposition){//这个方法用来实例化页卡
container.addView(mListViews.get(position),0);//添加页卡
returnmListViews.get(position);
}
@Override
publicintgetCount(){
returnmListViews.size();//返回页卡的数目
}
@Override
publicbooleanisViewFromObject(Viewarg0,Objectarg1){
returnarg0==arg1;//官方提示这样写
}
}

第一个view

packagecom.example.myviewpager;
importandroid.content.Context;
importandroid.view.LayoutInflater;
importandroid.view.View;
/**
*第一个
*@authorcgx
*
*/
publicclassView1{
	privateContextmContext;
	privateViewrootView;
	publicView1(ContextmContext){
		//TODOAuto-generatedconstructorstub
		this.mContext=mContext;
		//加载布局
		rootView=LayoutInflater.from(mContext).inflate(
				R.layout.view1_layout,null);
	}
	publicViewgetView(){
		returnrootView;
	}
}

activity布局文件

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
	<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#FFFFFF">
<TextView
android:id="@+id/text1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:gravity="center"
android:text="页卡1"
android:textColor="#000000"
android:textSize="20sp"/>
<TextView
android:id="@+id/text2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:gravity="center"
android:text="页卡2"
android:textColor="#000000"
android:textSize="20sp"/>
<TextView
android:id="@+id/text3"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:gravity="center"
android:text="页卡3"
android:textColor="#000000"
android:textSize="20sp"/>
</LinearLayout>
<com.example.myviewpager.MyViewPager
android:id="@+id/vPager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1.0"
android:background="#000000"
android:flipInterval="30"
/>
</LinearLayout>

View1的布局

<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#123456">
</LinearLayout>

由于用于演示,所以view的布局只是用不同的背景色来区分,开发中具体要展示的布局可以直接在view的布局文件里面改。demo中的view都是参考第一个来写的,类似

总结

实际开发中,虽然官方提供了很多api,真正等到要自己用的时候,还是自己在依照习惯再包装一层,成为自己的工具,这样以后就可以直接用了,上面的例子是我在实习期间总结的,鄙陋之处敬请原谅,也欢迎大家指出,一起学习(^_^)

代码链接:http://pan.baidu.com/s/1pJAF6Gz

tags:

上一篇  下一篇

相关:

明星圈的隐形土豪胡歌 学习胡歌绅士西装搭配


胡歌领衔主演的几部电视剧正在各大卫视热播中,霸屏小王子胡歌通过多部巨作以及在近期热播剧《大好

下班约APP官方预告地址 约个女友来体验




下班约,是广州爱圈信息科技有限公司致力研发的一款工友社交App,为广大工友们提供一个

盘点公司奇葩规定:员工轮流当保洁违规罚20元

洗厕所、洗碗、罚站——这都是小时候不听话被家长惩罚的措施吧?没想到,读了大学当上了白领,却还是要在公司

没有椅子时,古人怎么坐?

坐姿一:踞,伸开腿坐古人认真礼貌,即使独处,仍得谨慎。有一天,孟子要休妻,孟母问其故,曰:踞。意思是

帮你提升Python的27种编程语言

27 种语言过程型编程语言: C, Rust, Cython面向对象数据建模语言: Java, C#, EiffelC 的面向对象衍生语言:

Android动态加载技术三个关键问题详解

动态加载技术(也叫插件化技术)在技术驱动型的公司中扮演着相当重要的角色,当项目越来越庞大的时候,需要

如何才能成为一个好的技术领导者?

  近日,一名有超过15年软件开发经验的软件开发人员在Hacker News上提出了一个问题:如何才能成为一个好

黄加蓝,变绿!do加mi,咦怎么不变re

简而言之,问题的答案是这样的:人的听觉,感受到的就是声音的频谱,而 do+mi 的频谱与 re 的频谱完全不同。

我喜欢的人,都跟我有「夫妻相」,而且越来越像

从心理学的角度,喜欢跟自己长得像的人(所谓的夫妻相)是非常科学也非常正常的!再放宽一点说呢,人际交往

这世间,能让霍建华一秒变小公主的,只有胡歌了!!

这世间,能让霍建华一秒变小公主的,只有胡歌了!!整个画风都变了!尊上你这么娇羞真的好吗?!看到这里,

站长推荐: