Android_ViewPager_ViewPager使用详解及相应的adapter适配器

来源:互联网 发布:mp4视频修复软件 编辑:程序博客网 时间:2024/06/03 10:37

1.ViewPager事件

ViewPager通常和Fragment配合一起使用,能够使用适当的方式去管理每一页的生命周期,并使用PagerAdapter去生成每一页显示的view数据,向左向右可以滑出每页视图。

OnPageChangeListener{/** * This method will be invoked when the current page is scrolled, either as * part of a programmatically initiated smooth scroll or a user initiated * touch scroll. *  * @param position *            Position index of the first page currently being displayed. *            Page position+1 will be visible if positionOffset is nonzero. * @param positionOffset *            Value from [0, 1) indicating the offset from the page at *            position. * @param positionOffsetPixels *            Value in pixels indicating the offset from position. */public void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {}/** * This method will be invoked when a new page becomes selected. Animation * is not necessarily complete. *  * @param position *            Position index of the new selected page. */// 一个新页被调用时执行,仍为原来的page时,该方法不被调用public void onPageSelected(int position) {for (int i = 0; i < imageViews.length; i++) {imageViews[position].setBackgroundResource(R.drawable.guide_dot_green);if (position != i) {imageViews[i].setBackgroundResource(R.drawable.guide_dot_normal);}}}/** * Called when the scroll state changes. Useful for discovering when the * user begins dragging, when the pager is automatically settling to the * current page, or when it is fully stopped/idle. *  * @param state *            The new scroll state. * @see ViewPager#SCROLL_STATE_IDLE * @see ViewPager#SCROLL_STATE_DRAGGING * @see ViewPager#SCROLL_STATE_SETTLING *//* * SCROLL_STATE_IDLE: pager处于空闲状态  * SCROLL_STATE_DRAGGING: pager处于正在拖拽中 * SCROLL_STATE_SETTLING: pager正在自动沉降,相当于松手后,pager恢复到一个完整pager的过程 */public void onPageScrollStateChanged(int state) {// System.out.println("state:" + state);}/* * { private void setScrollState(int newState) { // ... * if(mOnPageChangeListener != null) { * mOnPageChangeListener.onPageScrollStateChanged(newState);//调用 } } */}

2.PagerAdapter

//PagerAdapter是object的子类class MyAdapter extends PagerAdapter {/** * PagerAdapter管理数据大小 */@Overridepublic int getCount() {return views.size();}/** * 关联key 与 obj是否相等,即是否为同一个对象 */@Overridepublic boolean isViewFromObject(View view, Object obj) {return view == obj; // key}/** * 销毁当前page的相隔2个及2个以上的item时调用 */@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object); // 将view 类型 的object熊容器中移除,根据key}/** * 当前的page的前一页和后一页也会被调用,如果还没有调用或者已经调用了destroyItem */@Overridepublic Object instantiateItem(ViewGroup container, int position) {container.addView(views.get(position));return views.get(position); // 返回该view对象,作为key}}

3.FragmentPagerAdapter

用户访问的每页数据都保存在内存中,因此适合访问页数不是很多的情况!使用至需要复写getItem(int) and getCount()方法,如果页数很多可以使用FragmentStatePagerAdapter,通过bundle保存每页的状态信息,因而占用内存就很小。

                       

public class MainActivity extends FragmentActivity implements TabListener,OnPageChangeListener {private ActionBar actionBar;private final static int TYPE_YULE = 0;private final static int TYPE_NEWS = 1;private final static int TYPE_SPORT = 2;private static List<Fragment> fragments;private ViewPager viewPager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);viewPager = (ViewPager) findViewById(R.id.container);actionBar = getActionBar();fragments = new ArrayList<Fragment>();fragments.add(new YuleFragment());fragments.add(new NewsFragment());fragments.add(new SportFragment());// actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.appmgr_btn_upgrade_selected));actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);actionBar.addTab(actionBar.newTab().setText("娱乐").setTag(TYPE_YULE).setTabListener(this));actionBar.addTab(actionBar.newTab().setText("新闻").setTag(TYPE_NEWS).setTabListener(this));actionBar.addTab(actionBar.newTab().setText("体育").setTag(TYPE_SPORT).setTabListener(this));viewPager.setAdapter(new MyAdapter(getSupportFragmentManager()));viewPager.setOnPageChangeListener(this);}private static class MyAdapter extends FragmentPagerAdapter {// staticpublic MyAdapter(FragmentManager fm) {super(fm);}@Overridepublic Fragment getItem(int position) {return fragments.get(position);}@Overridepublic int getCount() {return fragments.size();}}@Overridepublic void onTabSelected(Tab tab, FragmentTransaction ft) {int tag = Integer.parseInt(tab.getTag().toString());//设置当前的viewpager的当前viewItemviewPager.setCurrentItem(tag);}@Overridepublic void onPageSelected(int position) {//滑动时设置actionbar的当前tabactionBar.setSelectedNavigationItem(position);}@Overridepublic void onPageScrollStateChanged(int state) {}@Overridepublic void onTabUnselected(Tab tab, FragmentTransaction ft) {}@Overridepublic void onTabReselected(Tab tab, FragmentTransaction ft) {}@Overridepublic void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {}}

4.FragmentStatePagerAdapter

当有大量页数时,使用该类型的适配器很合适,类似于listview,当页面不在可见,fragment对象有可能销毁,但是,这些fragment的状态信息被保存下来,类似于activity的状态保存,从而占用很少的内存。用法与FragmentPagerAdapter 类似

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑卡住了文件没保存怎么办 迅雷卸载重装列表没了怎么办 多个dts文件音量不同怎么办 武装突袭3锁帧怎么办? 武装突袭3没子弹了怎么办 电脑系统注册表文件损坏怎么办 武装突袭3受伤了怎么办 模板跟旺铺版本不符合怎么办 cpu散热硅胶没了怎么办 武装突袭3掉帧怎么办 苹果系统占用内存太大怎么办 电脑上的文件打不开怎么办 word文件打开是乱码怎么办 wps文件打开是乱码怎么办 电脑读tst文件乱码怎么办 智能手机中了勒索病毒怎么办 部队训练脚崴了怎么办 滴滴车型信息识别失败怎么办 先打人被打了怎么办 我被警察打了怎么办 2k13选秀卡住了怎么办 正当防卫二进去之后没有字怎么办 国土防线2子弹打完了怎么办 诛仙宠物满了怎么办 试用联盟认证手机号是空号怎么办 系统出新版本不显示更新怎么办 炉石账号封停怎么办 电脑用户名和密码忘了怎么办 黑猴子棒球1闪退怎么办 斗米兼职报名后怎么办 婴儿足跟血检查有异常怎么办 打印机显示脱机使用打印机怎么办 手机刷机后内存变小了怎么办 吃了解毒丹喝酒怎么办 6s更新ios11失败怎么办 苹果6s手机发热怎么办 苹果手机没有描述文件怎么办 电脑玩穿越火线卡怎么办 老电脑又卡又慢怎么办 梦幻之星4花屏怎么办 失业连续好多天睡不着觉怎么办