ViewPager
来源:互联网 发布:手机监听监控定位软件 编辑:程序博客网 时间:2024/05/16 11:15
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;"><android.support.v4.view.ViewPager</span>
android:id="@+id/vp_viewpage" android:layout_width="fill_parent" android:layout_height="fill_parent" > </android.support.v4.view.ViewPager>
v4是兼容包,解决向下兼容问题
转载请注明出处:http://blog.csdn.net/wei_chong_chong/article/details/50935578
加载显示的页卡
将Layout布局转换为View对象的两种方式
(1)LayoutInflater lf = getLayoutInflater().from(this);
lf.inflate(resource,root);
(2)View.inflate(context,resource,root);
ViewPager相当于一个容器,里面可以装两种东西:(1)Fragment,(2)view对象
配置Adapter
(1)ViewPagerAdapter数据源:List<View>
(2)FragmentPagerAdapter数据源:List<Fragment>
(3)FragmentStatePagerAdapter数据源:List<Fragment>
先来学习ViewPagerAdapter
如下所示先来说一下PageTabStrip和PagerTitleStrip
这两个是ViewPager的子级标签
是用来显示页面的标题的,一般使用其中一个就行了,如果两个同时写,这上面那个将会失效,实际开发过程中,我们只使用其中一个
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <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.PagerTabStrip android:id="@+id/tab" android:layout_width="wrap_content" android:layout_height="wrap_content" > </android.support.v4.view.PagerTabStrip> <android.support.v4.view.PagerTitleStrip android:id="@+id/pagertitle" android:layout_width="fill_parent" android:layout_height="45dp" android:layout_gravity="bottom" />
</android.support.v4.view.ViewPager></LinearLayout>
首先在MainActivity中
private ViewPager pager;private List<View>viewList;private List<String>titleList;private PagerTabStrip tab;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);/** * 将Layout布局转换为View对象 * 通过View对象去作为ViewPager的数据源 */View view1 = View.inflate(this, R.layout.view1, null);View view2 = View.inflate(this, R.layout.view2, null);View view3 = View.inflate(this, R.layout.view3, null);View view4 = View.inflate(this, R.layout.view4, null);viewList=new ArrayList<View>();viewList.add(view1);viewList.add(view2);viewList.add(view3);viewList.add(view4);titleList=new ArrayList<String>();titleList.add("第一页");titleList.add("第二页");titleList.add("第三页");titleList.add("第四页");tab=(PagerTabStrip) findViewById(R.id.tab);//为PagerTabStrip设置一些属性tab.setBackgroundColor(Color.YELLOW);//设置背景颜色tab.setTabIndicatorColor(Color.BLUE);//设置下面短粗线的颜色tab.setDrawFullUnderline(false);//消去下面的长线//设置文字颜色tab.setTextColor(Color.RED);//初始化ViewPagerpager=(ViewPager) findViewById(R.id.pager);//创建PagerAdapter的适配器MyViewPagerAdapter adapter=new MyViewPagerAdapter(viewList, titleList);//加载适配器pager.setAdapter(adapter);
新建类创建适配器MayPagerAdapter,这里为每个页面添加了title
public class MyViewPagerAdapter extends PagerAdapter{private List<View>viewList;private List<String>titleList;public MyViewPagerAdapter(List<View>viewList,List<String>titleList){this.viewList=viewList;this.titleList=titleList;}//返回所有视图的数量,页卡的数量@Overridepublic int getCount() {// TODO Auto-generated method stubreturn viewList.size();} //判断视图view是否由对象产生@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stubreturn arg0==arg1;}//实例化一个页面 @Override public Object instantiateItem(ViewGroup container, int position) { // TODO Auto-generated method stub container.addView(viewList.get(position)); return viewList.get(position); } //删除销毁页面 @Override public void destroyItem(ViewGroup container, int position, Object object) { // TODO Auto-generated method stub container.removeView(viewList.get(position)); } @Override public CharSequence getPageTitle(int position) { // TODO Auto-generated method stub return titleList.get(position); }}
Adapter里面的常用方法
(1)getCount()需要返回所有页面的shul
(2)isViewFromObject(View arg0,Object arg1)判断视图是否由对象产生
(3)instantiateItem(ViewGroup containter,int position)实例化界面
(4)destroyItem(ViewGroup container,int position,Object object)销毁页面
(5
getPageTitle(int postiton)返回页面标题信息
下面学习FragmentPagerAdapter
首先写四个myFragment类继承Fragment.,需要导入v4包下的Fragment
在MainActivity中初始化,注意:下面在使用MyFragmentPagerAdapter时
构造方法的第一个参数必须使用getSupportFragmentManager()方法获取Fragment管理者而不是getFragmentManager()方法,因为创建Fragment时使用的是v4兼容包,(为了配合v4兼容包)并且必须让MainActivity继承自FragmentActivity而不是Activity
fragList=new ArrayList<Fragment>();fragList.add(new Fragment1());fragList.add(new Fragment2());fragList.add(new Fragment3());fragList.add(new Fragment4());
<span style="white-space:pre"></span>MyFragmentPagerAdapter adapter2=new MyFragmentPagerAdapter(getSupportFragmentManager(), fragList, titleList);<span style="white-space:pre"></span>pager.setAdapter(adapter2);<span style="white-space:pre"></span>创建myFragmentPagerAdapter
package com.example.android_viewpager;import java.util.List;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentPagerAdapter;import android.view.ViewGroup;public class MyFragmentPagerAdapter extends FragmentPagerAdapter{private List<Fragment>fragList;private List<String>titleList;public MyFragmentPagerAdapter(FragmentManager fm,List<Fragment> fragList,List<String>titleList) {super(fm);// TODO Auto-generated constructor stubthis.fragList=fragList;this.titleList=titleList;}@Overridepublic Fragment getItem(int arg0) {// TODO Auto-generated method stubreturn fragList.get(arg0);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn fragList.size();}@Overridepublic CharSequence getPageTitle(int position) {// TODO Auto-generated method stubreturn titleList.get(position);}}
ViewPagerAdapter和FragmentPagerAdapter的区别:
ViewPagerAdapter是动态加载和销毁页面的:
ViewPagerAdapter当页面超过三个时,一次加载3个页面(1,2,3)当显示第三个页面时,第一个页面将被销毁,第四个页面会提前被加载
FragmentPageAdapter不会动态加载和销毁,它是一次性加载完所有的页面,当页面超过3个时不推荐使用
FragmentStatePagerAdapter 和前面的 FragmentPagerAdapter 一样,是继承子 PagerAdapter。但是,和 FragmentPagerAdapter 不一样的是,正如其类名中的 'State' 所表明的含义一样,该 PagerAdapter 的实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源;而在页面需要显示时,生成新的页面(就像 ListView 的实现一样)。这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存。
解决办法:使用FragmentStatePagerAdapte
让MyFragmentPagerAdapter继承自FragmentStatePagerAdapter,并另外重写其中的两个方法就可以实现动态加载和销毁页面了
@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {// TODO Auto-generated method stubsuper.destroyItem(container, position, object);}@Overridepublic Object instantiateItem(ViewGroup arg0, int arg1) {// TODO Auto-generated method stubreturn super.instantiateItem(arg0, arg1);}
package com.example.android_viewpager;import java.util.List;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentPagerAdapter;import android.support.v4.app.FragmentStatePagerAdapter;import android.view.ViewGroup;public class MyFragmentPagerAdapter2 extends FragmentStatePagerAdapter{private List<Fragment>fragList;private List<String>titleList;public MyFragmentPagerAdapter2(FragmentManager fm,List<Fragment> fragList,List<String>titleList) {super(fm);// TODO Auto-generated constructor stubthis.fragList=fragList;this.titleList=titleList;}@Overridepublic Fragment getItem(int arg0) {// TODO Auto-generated method stubreturn fragList.get(arg0);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn fragList.size();}@Overridepublic CharSequence getPageTitle(int position) {// TODO Auto-generated method stubreturn titleList.get(position);}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {// TODO Auto-generated method stubsuper.destroyItem(container, position, object);}@Overridepublic Object instantiateItem(ViewGroup arg0, int arg1) {// TODO Auto-generated method stubreturn super.instantiateItem(arg0, arg1);}}总结:
Fragment的生命周期比较全,它的创建销毁等比View好控制
所有在做交互界面时使用Fragment,如果界面只是为了展示可以使用ViewPagerAdapter
- Viewpager
- ViewPager
- ViewPager
- ViewPager
- ViewPager
- ViewPager
- viewpager
- ViewPager
- ViewPager
- ViewPager
- Viewpager
- viewpager
- ViewPager
- ViewPager
- ViewPager
- viewpager
- ViewPager
- ViewPager
- 《生活不止眼前的苟且》 --许巍
- Java实现文件的读取操作
- YMS Round #1 Div. 2 C Mowing the Field
- opencv k-means
- Subset II [Leetcode 解题报告]
- ViewPager
- mysql在表的某一位置增加一列、删除一列、修改列名
- 支持Html渲染的TextView—LinkTextView
- poj1033 模拟(dfs)
- YMS Round #1 Div. 2 D Subsequences Summing to Sevens
- NFS服务的搭建
- Ajax学习(1)
- Hadoop核心组件之HDFS
- TrustZone初探(一)