ViewPager 详解(一)---基本入门

效果图:

实现了三个view间的相互滑动

第一个VIEW向第二个VIEW滑动       第二个VIEW向第三个VIEW滑动

  

一、新建项目,引入ViewPager控件

ViewPager。它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。

1.在主布局文件里加入

[html] view plain copy

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. tools:context="com.example.testviewpage_1.MainActivity" >
  6. <android.support.v4.view.ViewPager
  7. android:id="@+id/viewpager"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:layout_gravity="center" />
  11. </RelativeLayout>

其中 <android.support.v4.view.ViewPager /> 是ViewPager对应的组件,要将其放到想要滑动的位置

2、新建三个layout,用于滑动切换的视图

从效果图中也可以看到,我们的三个视图都非常简单,里面没有任何的控件,大家当然可以往里添加各种控件,但这里是个DEMO,只详解原理即可,所以我这里仅仅用背景来区别不用layout布局。

布局代码分别如下:

layout1.xml

[html] view plain copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:background="#ffffff"
  6. android:orientation="vertical" >
  7. </LinearLayout>

layout2.xml

[html] view plain copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:background="#ffff00"
  6. android:orientation="vertical" >
  7. </LinearLayout>

layout3.xml
[html] view plain copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:background="#ff00ff"
  6. android:orientation="vertical" >
  7. </LinearLayout><span style="color:#660000;">
  8. </span>

二、代码实战

先上整体代码,然后逐步讲解。
[java] view plain copy

  1. package com.example.testviewpage_1;
  2. /**
  3. * @author  harvic
  4. * @date 2014.8.9
  5. */
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import java.util.zip.Inflater;
  9. import android.app.Activity;
  10. import android.os.Bundle;
  11. import android.support.v4.view.PagerAdapter;
  12. import android.support.v4.view.ViewPager;
  13. import android.view.LayoutInflater;
  14. import android.view.View;
  15. import android.view.ViewGroup;
  16. public class MainActivity extends Activity {
  17. private View view1, view2, view3;
  18. private ViewPager viewPager;  //对应的viewPager
  19. private List<View> viewList;//view数组
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main);
  24. viewPager = (ViewPager) findViewById(R.id.viewpager);
  25. LayoutInflater inflater=getLayoutInflater();
  26. view1 = inflater.inflate(R.layout.layout1, null);
  27. view2 = inflater.inflate(R.layout.layout2,null);
  28. view3 = inflater.inflate(R.layout.layout3, null);
  29. viewList = new ArrayList<View>();// 将要分页显示的View装入数组中
  30. viewList.add(view1);
  31. viewList.add(view2);
  32. viewList.add(view3);
  33. PagerAdapter pagerAdapter = new PagerAdapter() {
  34. @Override
  35. public boolean isViewFromObject(View arg0, Object arg1) {
  36. // TODO Auto-generated method stub
  37. return arg0 == arg1;
  38. }
  39. @Override
  40. public int getCount() {
  41. // TODO Auto-generated method stub
  42. return viewList.size();
  43. }
  44. @Override
  45. public void destroyItem(ViewGroup container, int position,
  46. Object object) {
  47. // TODO Auto-generated method stub
  48. container.removeView(viewList.get(position));
  49. }
  50. @Override
  51. public Object instantiateItem(ViewGroup container, int position) {
  52. // TODO Auto-generated method stub
  53. container.addView(viewList.get(position));
  54. return viewList.get(position);
  55. }
  56. };
  57. viewPager.setAdapter(pagerAdapter);
  58. }
  59. }

代码量很小,全部放在了OnCreate()函数中。

1、先看声明的变量的意义:

[java] view plain copy

  1. private View view1, view2, view3;
  2. private List<View> viewList;//view数组
  3. private ViewPager viewPager;  //对应的viewPager

首先viewPager对应 <android.support.v4.view.ViewPager/>控件。

view1,view2 ,view3对应我们的三个layout,即layout1.xml,layout2.xml,layout3.xml

viewList是一个View数组,盛装上面的三个VIEW

2、接下来是他们的初始化过程:

[java] view plain copy

  1. viewPager = (ViewPager) findViewById(R.id.viewpager);
  2. LayoutInflater inflater=getLayoutInflater();
  3. view1 = inflater.inflate(R.layout.layout1, null);
  4. view2 = inflater.inflate(R.layout.layout2,null);
  5. view3 = inflater.inflate(R.layout.layout3, null);
  6. viewList = new ArrayList<View>();// 将要分页显示的View装入数组中
  7. viewList.add(view1);
  8. viewList.add(view2);
  9. viewList.add(view3);

初始化过程难度不大,就是将资源与变量联系起来布局,最后将实例化的view1,view2,view3添加到viewList中

3、PageAdapter——PageView的适配器

适配器这个东东想必大家都不莫生,在ListView中也有适配器,listView通过重写GetView()函数来获取当前要加载的Item。而PageAdapter不太相同,毕竟PageAdapter是单个VIew的合集。

PageAdapter 必须重写的四个函数:

  • boolean isViewFromObject(View arg0, Object arg1)
  • int getCount()
  • void destroyItem(ViewGroup container, int position,Object object)
  • Object instantiateItem(ViewGroup container, int position)

先看看各个函数,我们上面都做了什么吧:

[java] view plain copy

  1. @Override
  2. public int getCount() {
  3. // TODO Auto-generated method stub
  4. return viewList.size();
  5. }

getCount():返回要滑动的VIew的个数

[java] view plain copy

  1. @Override
  2. public void destroyItem(ViewGroup container, int position,
  3. Object object) {
  4. // TODO Auto-generated method stub
  5. container.removeView(viewList.get(position));
  6. }

destroyItem():从当前container中删除指定位置(position)的View;
[java] view plain copy

  1. @Override
  2. public Object instantiateItem(ViewGroup container, int position) {
  3. // TODO Auto-generated method stub
  4. container.addView(viewList.get(position));
  5. return viewList.get(position);
  6. }
  7. };

instantiateItem():做了两件事,第一:将当前视图添加到container中,第二:返回当前View
[java] view plain copy

  1. @Override
  2. public boolean isViewFromObject(View arg0, Object arg1) {
  3. // TODO Auto-generated method stub
  4. return arg0 == arg1;
  5. }

isViewFromObject():对于这个函数就先不做讲解,大家目前先知道它要这样重写就行了,后面我们会对它进行改写。

Android 应用开发---ViewPager----1.相关基本知识相关推荐

  1. Android音频开发(一):音频基础知识

    一.Android音频开发(一):音频基础知识 二.Android音频开发(二):录制音频(WAV及MP3格式) 三.Android音频开发(三):使用ExoPlayer播放音频 四.Android音 ...

  2. Android商城开发----viewPager实现广告轮播(在首页Fragment中实现)

    Android商城开发----在商城首页Fragment使用viewPager实现广告轮播 写在前面:本篇文章建立在创建底部导航栏之后,对商城首页进行开发.创建底部导航栏的内容请查看:Android开 ...

  3. Android应用开发—ViewPager FragmentPagerAdapter和FragmentStatePagerAdapter下Fragment的生命周期

    ViewPager配合不同的PagerAdapter,对应Fragment的生命周期有着不同的表现,了解这个生命周期机制对于开发者选择合适的PagerAdapter实现不同的效果,有着很大的帮助. F ...

  4. Android App 开发技术图谱

    Android App 开发技术图谱 转载请注明出处:www.leoyanblog.com 本文出自 LeoYan 的博客 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 LeoYa ...

  5. android nfc ndef mifareclassic,Android NFC开发-实践篇

    Android NFC开发-实践篇 https://blog..net/_GYG/article/details/72899417 在Android NFC开发-理论篇中,我们了解了在Android中 ...

  6. Android NFC开发-实践篇

    Android NFC开发-实践篇 在Android NFC开发-理论篇中,我们了解了在Android中开发NFC的一些理论知识,这篇我们继续应用我们上一篇学到的知识,实现对NDEF格式标签和Mifa ...

  7. 在Android软件开发教学过程中应当注意的事项总结

    近些年来,为了提升学生就业率和收入水平,某些高校或培训机构将Android软件开发当做一门专业学科.Android学科的主要目标是培养学生快速掌握Android开发基本知识和技能,以便于学生利用掌握的 ...

  8. android studio微信界面设计,android studio开发微信界面

    android studio开发微信界面 android studio开发微信界面 功能说明:主要是做微信的简单的聊天界面,利用Fragment,进行微信界面的跳转 项目代码: 源代码地址 MainA ...

  9. Android音频开发(四):音频播放模式

    一.Android音频开发(一):音频基础知识 二.Android音频开发(二):录制音频(WAV及MP3格式) 三.Android音频开发(三):使用ExoPlayer播放音频 四.Android音 ...

  10. 《Android系统开发》笔记

    <Android系统开发>笔记1:Android系统概述 Android四层架构: 1. Linux Kernel&driver层 a.依赖于Linux 2.6内核,包括安全性,内 ...

最新文章

  1. 适用于Android的OpenSL ES指南-OpenSL ES的Android扩展
  2. gcc的警告提示信息
  3. 在PHP中对象真的是按引用传递的吗
  4. c#日期转换周几_C#中获取任意日期为星期几三种方法分享
  5. (转)让我们原谅齐达内吧!(附一张落泪的照片)
  6. 【elasticsearch】ClusterBlockException[blocked by: [FORBIDDEN/12/index read-only / allow delete (api)]
  7. git add用法详解,参数列表,git add -A/git add -u/git add .区别
  8. 5G商用牌照近期发放;华为削减手机订单;苹果、亚马逊、Google遭调查 | 极客头条...
  9. python中input数组_python-numpy.interp和掩码数组
  10. 攻防世界-Misc-gif
  11. TED如何和压力做朋友(第四天完)
  12. matlab仿真之大尺度衰落因子2--小区间
  13. 试图加载 Crystal Reports 运行时出现错误
  14. 用树莓派做一个人脸识别开锁应用
  15. ASCII码对照表(Python代码实现打印,python-docx库/xlwt库/fpdf库)
  16. 《Real-Time Rendering 4th Edition》读书笔记--简单粗糙翻译 第三章 图形处理单元 The Graphics Processing Unit
  17. Nginx 安装部署以及负载均衡
  18. 管理学之父彼得·德鲁克:目标管理的基本思路、原则及分解方法
  19. HMM模型及相关算法
  20. 【深度学习】综述 | 深度学习的最新进展

热门文章

  1. 数字图像处理(四)——图像编码技术(二)
  2. Linux中断(interrupt)子系统之二:arch相关的硬件封装层
  3. java修饰方法_java接口中方法、属性修饰符详解
  4. html5饼图的制作方法,html5制作饼图
  5. mysql 8 强制修改密码_Mysql 8.0版本强制无密码进入+更改密码
  6. 开发利器JRebel部署SpringBoot项目
  7. translucent 属性
  8. 【C++】为什么INT_MIN不是直接写成-2147483648(转载)
  9. Windows phone UI虚拟化和数据虚拟化(一)
  10. 关于地理国情监测(国家测绘局、地理信息系统协会改名及国家级地理信息产业园奠基的风生水起)...