ViewPager使用方法详解 - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 技术分享 >

ViewPager使用方法详解

发表时间:2020-10-19

发布人:葵宇科技

浏览次数:120


今天我们来看看ViewPager,这个控件异常实用。闲话不说,直接进入主题:
要构造ViewPager,先说几点要留意一点,ViewPager 是存在于Android的 v4 兼容包里:
[img]
android.jar 就是我们的最重要的sdk, android.support.v4.jar 就是android为了高版本sdk兼容低版本体系而创建的兼容包。 ViewPager就是一个控件,和TextView一个级别,其初始办法要应用到Adapter,我们天然愫想到了ListView。那么它与ListView最大年夜的不合就是其初始化时可以应用3中Adapter:
(1)PagerAdapter :用于初始化view,
(2)FragmentPagerAdapter:用于初始化 Fragment,
(3)FragmentStatePagerAdapter:和FragmentPagerAdapter类似,然则供给加倍周全的创建和烧毁功能。
接下来我们来一一介绍,先贴一张效不雅图:
[img]
1. 要应用ViewPager,起首须要在构造中惹人控件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <android.support.v4.view.PagerTabStrip
            android:id="@+id/pagertabstrip"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

        </android.support.v4.view.PagerTabStrip>
    </android.support.v4.view.ViewPager>

</LinearLayout>
ViewPager就是我们的控件, PagerTabStrip是title。
2.  惹人控件之后, 和listview一样, 我们就须要对其添加数据. 方才已经介绍过, 添加数据一共有3中Adapter,先来介绍最简单的一种PagerAdapter。
我们须要持续PagerAdapter,然后重写琅绫擎的办法:
package com.xiaoming.demo01_viewpager;

import java.util.List;

import android.support.v4.view.PagerAdapter;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

public class MyPagerAdapter extends PagerAdapter {
	private static final String TAG = "MyPagerAdapter";
	private List<View> mViewList;
	private List<String> mTitleList;
	
	public MyPagerAdapter(List<View> viewlist, List<String> titlelist) {
		this.mViewList = viewlist;
		this.mTitleList = titlelist;
	}

	@Override
	public int getCount() {
		return mViewList.size();
	}

	@Override
	public boolean isViewFromObject(View view, Object obj) {
		return view==obj;
	}
	
	@Override
	public Object instantiateItem(ViewGroup container, int position) {
		container.addView(mViewList.get(position));
		Log.d(TAG,"instantiateItem,"+"position:"+position);
		return mViewList.get(position);
	}
	
	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		container.removeView(mViewList.get(position));
		Log.d(TAG,"destroyItem,"+"position:"+position);
	}
	
	@Override
	public CharSequence getPageTitle(int position) {
		return mTitleList.get(position);
	}
	

}
mViewList 是传入要显示的View列表,在MainActivity中的初始化为:
[img]
mTitleList 是传入对应每页要显示的title,在MainActivity中的初始化为:
[img]
这里须要重写的几个办法也很简单:
(1)getCount() : 获取总共页数
(2)isViewFromObject(View view, Object obj):断定view是否是指定的obj,直接参照官方api:return view==obj;
(3)instantiateItem(ViewGroup container, int position):用来初始化容器中的内容:
         先是添加到容器中:container.addView(mViewList.get(position));
         然后返回显示的view:return mViewList.get(position);
(4)destroyItem(ViewGroup container, int position, Object object):移除对象,并且烧毁不要的对象:
   container.removeView(mViewList.get(position));
(5)getPageTitle(int position): 获得对应页的标题: return mTitleList.get(position);
5个办法都很简单,重写完之后我们就可以来加载ViewPager了:
mViewPager = (ViewPager) findViewById(R.id.viewpager);

MyPagerAdapter myadapter = new MyPagerAdapter(viewlist, titlelist);

mViewPager.setAdapter(myadapter);

如许就完成了。如不雅想监听viewpager变更时的时光,可以给MainActivity实现 OnPageChangeListener, 然后重写这三个办法,我们这里用最简单的toast来提示:
	@Override
	public void onPageScrollStateChanged(int arg0) {
	}

	@Override
	public void onPageScrolled(int arg0, float arg1, int arg2) {
	}

	@Override
	public void onPageSelected(int arg0) {
		showToast("当前是第" + arg0 + "页");
	}

3. 介绍完了应用PagerAdapter,我们来介绍应用Fragment填充ViewPager内容:
和应用view一样,起首须要初始化一个Fragment列表(至于fragment不在这里介绍):
[img]
然后写一个adapter持续至 FragmentPagerAdapter:
package com.xiaoming.demo01_viewpager;

import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class MyFragmentPageAdapter extends FragmentPagerAdapter {
	private List<Fragment> mListFragment;
	private List<String> mListTitle;
	

	public MyFragmentPageAdapter(FragmentManager fm,
			List<Fragment> listFragment, List<String> listTitle) {
		super(fm);
		this.mListFragment = listFragment;
		this.mListTitle = listTitle;
	}

	@Override
	public Fragment getItem(int position) {
		return mListFragment.get(position);
	}

	@Override
	public int getCount() {
		return mListFragment.size();
	}
	
	@Override
	public CharSequence getPageTitle(int position) {
		return mListTitle.get(position);
	}

}
实现的办法重要少了两个:instantiateItem() 和 destroyItem() ,因为在应用fragment和ViewPager浇忧⒛时刻,第一次加载ViewPager,就会把所有的fragment都加载进入,并且知道ViewPager烧毁时才会烧毁fragment列表中的fragment。 然则在应用 pageradapter的时刻,一次体系加载3个view中内存中,会动态的创建和删除大年夜于3个的部分。相面代码中也有log,大年夜家可以参考看一下。
在MainActivity中应用:
        MyFragmentPageAdapter fadapter = new MyFragmentPageAdapter(getSupportFragmentManager(), fragmentlist, titlelist);

        mViewPager.setAdapter(fadapter);

这里须要留意,初始化 FragmentPageAdapter第一个参数是 FragmentManager,用来治理Fragmnet。获得FragmentManager有两种情况:
(1)如不雅应用 import android.support.v4.app.Fragment;  就是v4包中的Fragment,须要应用Activity 的 getSupportFragmentManager() 获得FragmentManager。
(2)如不雅应用 import android.app.Fragment; 就是正牌Fragmnet,兼容性没有那么好,直接应用Activity 的 getFragmentManager() 获得FragmentManager。
4. 应用 FragmentStatePagerAdapter 填充 :
package com.xiaoming.demo01_viewpager;

import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.view.ViewGroup;

public class MyFragmentStatePageAdapter extends FragmentStatePagerAdapter {
	private List<Fragment> mListFragment;
	private List<String> mListTitle;
	

	public MyFragmentStatePageAdapter(FragmentManager fm,
			List<Fragment> listFragment, List<String> listTitle) {
		super(fm);
		this.mListFragment = listFragment;
		this.mListTitle = listTitle;
	}

	@Override
	public Fragment getItem(int position) {
		return mListFragment.get(position);
	}

	@Override
	public int getCount() {
		return mListFragment.size();
	}
	
	@Override
	public CharSequence getPageTitle(int position) {
		return mListTitle.get(position);
	}
	
	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		super.destroyItem(container, position, object);
	}
	
	@Override
	public Object instantiateItem(ViewGroup arg0, int arg1) {
		return super.instantiateItem(arg0, arg1);
	}

}
应用办法和应用FragmentPagerAdapter完全一样,就是多重写了两个办法,并且都是应用的父类的实现:
	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		super.destroyItem(container, position, object);
	}
	
	@Override
	public Object instantiateItem(ViewGroup arg0, int arg1) {
		return super.instantiateItem(arg0, arg1);
	}
所以FragmentStatePagerAdapter 比 FragmentPagerAdapter 多的功能就是可以动态的治理显示和烧毁fragment。
总结一下:
填充ViewPager的内容一共有3中方法:
(1)应用PagerAdapter,最简单,便利,和view结合。可以动态创建和烧毁ViewPager中页的内容。
(2)应用FragmentPagerAdapter,应用fragmnet作为Viewpager内容,fragment的生命周期加倍可控,所以更推荐。然则不克不及动态创建和烧毁ViewPager中页的内容。然则这也不见得不是功德哦!
(3)FragmentStatePagerAdapter 像是PagerAdapter和FragmentPagerAdapter的结合,及应用fragment,又可以实现动态加载内容。
好了,停止!!
下面可贴上代码:
http://download.csdn.net/detail/u013647382/8329741

相关案例查看更多