1、概述

ViewPager,顾名思义实现控件的滚动功能,是Support-v4的包中类,使用前要先导包。使用的时候跟listView有点相似,需要设置对应的适配器,通常有俩大类

【pageAdapter】

【FragmentPagerAdapter/FragmentStatePagerAdapter】

fragment有着自己的生命周期,谷歌官方也推荐使用ViewPage+fragment的形式,一般简单的也可以使用ViewPage+pageAdapter形式

这里用这俩种适配器来搭个框架学习使用一下,先上使用FragmentPagerAdapter的效果图

1、FragmentPagerAdapter/FragmentStatePagerAdapter

首先他们都是继承自PagerAdapter,FragmentPagerAdapter适合使用在固定的数量较少的场景,比如本例的4个tab的fragment滑动界面,而FragmentStatePagerAdapter适合适合用在多个tab场景下,并且会保存当前界面以及下一个界面和上一界面,最多可以保留3个(具体源码分析参见http://blog.csdn.net/jackrex/article/details/9885469?utm_source=tuicool&utm_medium=referral)他们的使用方式一致,这里以FragmentPagerAdapter来看

在使用FragmentPagerAdapter时我们首先要实现它的俩个方法,如下

//初始化Adapter这里使用FragmentPagerAdapter
        mAdpter = new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {

                return mFragments.get(position);
            }

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

        };

方法一目了然,getCount()返回的是ViewPager页面的数量,getItem()返回的是要显示的fragent对象。

从这里看到我们管理的对象是不同的fragment对应不同的布局

2、pageAdapter

使用pageradapter,至少必须重写下面的四个方法

【 instantiateItem(ViewGroup, int)】

这个函数的实现的功能是创建指定位置的页面视图。适配器有责任增加即将创建的View视图到这里给定的container中,这是为了确保在finishUpdate(viewGroup)返回时这个已经完成

返回值:返回一个代表新增视图页面的Object

【public void destroyItem (ViewGroup container, int position, Object object)】

该方法实现的功能是移除一个给定位置的页面。适配器有责任从容器中删除这个视图。这是为了确保在finishUpdate(viewGroup)返回时视图能够被移除。

【 public int getCount()】

返回当前有效视图的个数。

【isViewFromObject(View, Object)】

功能:该函数用来判断instantiateItem(ViewGroup, int)函数所返回来的Key与一个页面视图是否是代表的同一个视图(即它俩是否是对应的,对应的表示同一个View)

返回值:如果对应的是同一个View,返回True,否则返回False。

3、viewpager+fragment demo代码实现

主要目录结构如下

主布局文件activity_main.xml如下

<?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="wrap_content"
    android:background="@color/white"
    android:orientation="vertical">

    <include layout="@layout/topbar_layout"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/id_viewpager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
    </android.support.v4.view.ViewPager>

    <include layout="@layout/bottom"/>

</LinearLayout>

可以看出这里通过include包含一头一尾,中间是V4包中的ViewPager

bottom.xml代码如下

<?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="wrap_content"
              android:orientation="horizontal"
              android:layout_marginBottom="5dp"
              android:background="@color/mainpage_mycrircle_leftview_item_auth_name"
    >

    <LinearLayout
        android:id="@+id/id_tab_mycircle"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical">
        <!-- android:clickable="false" 是为了防止ImageButton截取了触摸事件 ,这里事件要给它的上一级linearlayout-->
        <ImageButton
            android:id="@+id/id_tab_mycirlceImg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#00000000"
            android:clickable="false"
            android:src="@drawable/mainpage_tab_mycircle_selected"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我的圈子"
            />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/id_tab_discovery"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical">

        <ImageButton
            android:id="@+id/id_tab_discovery_img"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#00000000"
            android:clickable="false"
            android:src="@drawable/mainpage_tab_discovery_normal"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="发现"
            />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/id_tab_message"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical">

        <ImageButton
            android:id="@+id/id_tab_message_img"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#00000000"
            android:clickable="false"

            android:src="@drawable/mainpage_tab_message_normal"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="消息"
            />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/id_tab_setting"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical">

        <ImageButton
            android:id="@+id/id_tab_setting_img"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#00000000"
            android:clickable="false"
            android:src="@drawable/mainpage_tab_setting_normal"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="个人中心"
            />
    </LinearLayout>
</LinearLayout>

通过权重这里也可以使用RadioGroup来做这个底部

然后是MainActivity处理逻辑函数

package com.elvis.gachatest;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageButton;
import android.widget.LinearLayout;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    //定义控件
    private ViewPager mViewPager;
    private FragmentPagerAdapter mAdpter;
    private List<Fragment> mFragments = new ArrayList<>();

    //四个Tab每个Tab都有一个按钮
    private LinearLayout mTabMyCircle;
    private LinearLayout mTabMyDiscovery;
    private LinearLayout mTabMyMsg;
    private LinearLayout mTabMyCenter;
    //四个按钮
    private ImageButton myCircleImg;
    private ImageButton myDiscoveryImg;
    private ImageButton myMsgImg;
    private ImageButton myCenterImg;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initViews();//初始化控件
        initEvent();//监听逻辑事件

        initViewPages();//初始化viewpager
    }

    private void initViews() {

        mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
        //初始化四个布局
        mTabMyCircle = (LinearLayout) findViewById(R.id.id_tab_mycircle);
        mTabMyDiscovery = (LinearLayout) findViewById(R.id.id_tab_discovery);
        mTabMyMsg = (LinearLayout) findViewById(R.id.id_tab_message);
        mTabMyCenter = (LinearLayout) findViewById(R.id.id_tab_setting);
        //初始化四个按钮
        myCircleImg = (ImageButton) findViewById(R.id.id_tab_mycirlceImg);
        myDiscoveryImg = (ImageButton) findViewById(R.id.id_tab_discovery_img);
        myMsgImg = (ImageButton) findViewById(R.id.id_tab_message_img);
        myCenterImg = (ImageButton) findViewById(R.id.id_tab_setting_img);
    }

    private void initViewPages() {
        //初始化四个布局
        Fragment01 tab01 = new Fragment01();
        Fragment02 tab02 = new Fragment02();
        Fragment03 tab03 = new Fragment03();
        Fragment04 tab04 = new Fragment04();
        mFragments.add(tab01);
        mFragments.add(tab02);
        mFragments.add(tab03);
        mFragments.add(tab04);
        //初始化Adapter这里使用FragmentPagerAdapter
        mAdpter = new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {

                return mFragments.get(position);
            }

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

        };
        mViewPager.setAdapter(mAdpter);

    }

    private void initEvent() {
        //设置监听器
        myCircleImg.setOnClickListener(this);
        myDiscoveryImg.setOnClickListener(this);
        myMsgImg.setOnClickListener(this);
        myCenterImg.setOnClickListener(this);
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                //当viewPager滑动的时候
                int currentPage = mViewPager.getCurrentItem();
                switch (currentPage) {
                    case 0:
                        reSetImg();
                        myCircleImg.setImageResource(R.drawable.mainpage_tab_mycircle_selected);
                        break;
                    case 1:
                        reSetImg();
                        myDiscoveryImg.setImageResource(R.drawable.mainpage_tab_discovery_selected);
                        break;
                    case 2:
                        reSetImg();
                        myMsgImg.setImageResource(R.drawable.mainpage_tab_message_selected);
                        break;
                    case 3:
                        reSetImg();
                        myCenterImg.setImageResource(R.drawable.mainpage_tab_setting_selected);
                        break;
                    default:
                        break;
                }

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

    }

    private void reSetImg() {
        myCircleImg.setImageResource(R.drawable.mainpage_tab_mycircle_normal);
        myDiscoveryImg.setImageResource(R.drawable.mainpage_tab_discovery_normal);
        myMsgImg.setImageResource(R.drawable.mainpage_tab_message_normal);
        myCenterImg.setImageResource(R.drawable.mainpage_tab_setting_normal);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.id_tab_mycirlceImg:
                mViewPager.setCurrentItem(0);
                reSetImg();
                myCircleImg.setImageResource(R.drawable.mainpage_tab_mycircle_selected);
                break;
            case R.id.id_tab_discovery_img:
                mViewPager.setCurrentItem(1);
                reSetImg();
                myDiscoveryImg.setImageResource(R.drawable.mainpage_tab_discovery_selected);
                break;
            case R.id.id_tab_message_img:
                mViewPager.setCurrentItem(2);
                reSetImg();
                myMsgImg.setImageResource(R.drawable.mainpage_tab_message_selected);
                break;
            case R.id.id_tab_setting_img:
                mViewPager.setCurrentItem(3);
                reSetImg();
                myCenterImg.setImageResource(R.drawable.mainpage_tab_setting_selected);
                break;
            default:
                break;

        }

    }

}

这里要注意使用Fragment时统统使用V4包下的fragment,否则会出错

要是使用pageAdapter方式核心代码如下

 private void initViewPages() {
        //初始化四个布局
        LayoutInflater mLayoutInflater = LayoutInflater.from(this);
        View tab1 = mLayoutInflater.inflate(R.layout.tab01, null);
        View tab2 = mLayoutInflater.inflate(R.layout.tab02, null);
        View tab3 = mLayoutInflater.inflate(R.layout.tab03, null);
        View tab4 = mLayoutInflater.inflate(R.layout.tab04, null);
        //加入到list中
        mViews.add(tab1);
        mViews.add(tab2);
        mViews.add(tab3);
        mViews.add(tab4);

        //初始化ViewPager适配器
        mPagerAdapter = new PagerAdapter() {
            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                //从container中删除指定position的View
                container.removeView(mViews.get(position));
            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                //将当前视图添加到View中
                View view = mViews.get(position);
                container.addView(view);
                //返回当前视图
                return view;
            }

            @Override
            public int getCount() {
                //返回要滑动的View个数
                return mViews.size();
            }

            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }

        };
        //设置adapter
        mViewPager.setAdapter(mPagerAdapter);

    }

demo地址 http://download.csdn.net/detail/xsf50717/9259105

ViewPager适配器学习记录( pageAdapter和FragmentPagerAdapter/FragmentStatePagerAdapter))的更多相关文章

  1. 【转】BLE 学习记录

    原文网址:http://m.blog.csdn.net/blog/chiooo/43985401 BLE 学习记录 ANROID BLE 开发,基于 bluetoothlegatt 分析 mBluet ...

  2. Material Calendar View 学习记录(二)

    Material Calendar View 学习记录(二) github link: material-calendarview; 在学习记录一中简单翻译了该开源项目的README.md文档.接下来 ...

  3. V4L2学习记录【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637600.html V4L2学习记录 这个还没有分析完,先在这放着,防止电脑坏掉丢了,以后再完善 V4L ...

  4. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  5. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  6. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  7. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

  8. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  9. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

随机推荐

  1. Objective-C中的消息发送总结

    关于OC中的消息发送的实现,在去年也看过一次,当时有点不太理解,但是今年再看却很容易理解. 我想这跟知识体系的构建有关,如果你不认识有砖.水泥等这些建筑的基本组成部分,那么我们应该很难理解建筑是怎么建 ...

  2. linux C 获取与修改IP地址

    主要有两种方法: 一种是用system执行shell命令,如: system("ifconfig usb0 192.168.1.188"); 另一种用ioctl系统调用: int ...

  3. RAP在线接口管理统计部署

    文档: https://github.com/thx/RAP/wiki/home_cn centos上部署 参考:https://github.com/thx/RAP/wiki/deploy_on_c ...

  4. iter 函数另类用法

    它可以很简单地构造一个无限迭代器: ): print(i) #将无限打印出0 原来,如果iter有第二个参数,那么第一个参数必须是一个参数可以省略的可调用对象.int函数符合这种要求. 迭代什么时候停 ...

  5. VMware 下的CentOS6.7 虚拟机与Windows7通信

    在有网络的情况下,VMware 虚拟机使用桥接模式(Bridged) 和NAT方式,会自动通信,但是在没有网络的情况下怎么办呢?对,是的,使用host-only模式,如何设置呢? 注:将Windows ...

  6. For oracle databases, if the top showing the oracle database, then oracle process is using the top c

    Note 805586.1   Troubleshooting Session Administration (Doc ID 805586.1)Note 822527.1   How To Find ...

  7. J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP

    J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP 前言   搜狐畅游笔试题中有一道问答题涉及到回答谈谈对Spring IOC与AOP的理解.特将相关内容进行整理.    ...

  8. java项目管理工具maven使用初级

    一.前言        早就知道maven 在java 项目的管理方面名声显赫,于是就想着学习掌握之,于是查阅了大量文档.发现这些文档的作者都是java 的大腕,大多都是站在掌握了一定maven 基础 ...

  9. 指令汇B新闻客户端开发(五) ShareSdk的使用

    ShareSdk是一个分享按钮的开源框架,我们首先可以去mob的官网下载这个控件.mob官网,然后找到sdk下载那一栏, 下载下来之后点击这个.jar文件就会有一个弹窗,填写自己的应用包名和要哪些分享 ...

  10. Dynamics CRM 后台通过组织服务获取时间字段值的准确转换

    做CRM开发的都知道,在系统时间字段的处理上是有讲究的,因为数据库中存的是UTC时间,CRM的界面时间字段会根据个人设置中的时区以及格式自动调整,这是最基本的一面,那还有很多使用时间的场景,比如脚本使 ...