1. 程式人生 > >ViewPager用法詳細解析

ViewPager用法詳細解析

ViewPager詳解

  • ViewPager中的主要方法詳解
  • OnPageChangeListener中的三個方法詳解
  • 三種介面卡的使用及其主要方法詳解

ViewPager用於實現頁面間的切換。

ViewPager中的主要方法詳解

  • setAdapter(PagerAdapter adapter) 
    該方法為ViewPager設定介面卡,ViewPager有三種介面卡,它們分別有不同的特性,下面我會對這三種介面卡進行講解。
  • setCurrentItem(int item) 
    該方法設定顯示item位置的介面。
  • setOffscreenPageLimit(int limit) 
    該方法用來設定當前顯示頁面左右兩邊
    快取的頁面數。
  • addOnPageChangeListener(OnPageChangeListener listener) 
    該方法為ViewPager新增頁面切換時的監聽,關於介面監聽的內容,接下來對OnPageChangeListener中的方法進行講解時,再詳細說明。
  • setOnScrollChangeListener(OnScrollChangeListener l) 
    該方法為ViewPager增加滾動狀態監聽,但該方法需要minSdkVersion為23

OnPageChangeListener中的三個方法詳解

  • onPageScrollStateChanged(int state)
     
    該方法在手指操作螢幕的時候發生變化。有三個值:0(END),1(PRESS) ,2(UP) 。當用手指滑動翻頁時,手指按下去的時候會觸發這個方法,state值為1,手指擡起時,如果發生了滑動(即使很小),這個值會變為2,然後最後變為0 。總共執行這個方法三次。一種特殊情況是手指按下去以後一點滑動也沒有發生,這個時候只會呼叫這個方法兩次,state值分別是1,0 。當setCurrentItem翻頁時,會執行這個方法兩次,state值分別為2 ,0 。
  • onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
     
    該方法在滑動過程中將一直被呼叫,該方法的引數說明如下: 
    position:當用手指滑動時,如果手指按在頁面上不動,position和當前頁面index是一致的;如果手指向左拖動(相應頁面向右翻動),這時候position大部分時間和當前頁面是一致的,只有翻頁成功的情況下最後一次呼叫才會變為目標頁面;如果手指向右拖動(相應頁面向左翻動),這時候position大部分時間和目標頁面是一致的,只有翻頁不成功的情況下最後一次呼叫才會變為原頁面。當直接設定setCurrentItem翻頁時,如果是相鄰的情況(比如現在是第二個頁面,跳到第一或者第三個頁面),如果頁面向右翻動,大部分時間是和當前頁面是一致的,只有最後才變成目標頁面;如果向左翻動,position和目標頁面是一致的。這和用手指拖動頁面翻動是基本一致的。如果不是相鄰的情況,比如我從第一個頁面跳到第三個頁面,position先是0,然後逐步變成1,然後逐步變成2;我從第三個頁面跳到第一個頁面,position先是1,然後逐步變成0,並沒有出現為2的情況。 
    positionOffset:當前頁面滑動比例,如果頁面向右翻動,這個值不斷變大,最後在趨近1的情況後突變為0。如果頁面向左翻動,這個值不斷變小,最後變為0。 
    positionOffsetPixels:當前頁面滑動畫素,變化情況和positionOffset一致
  • onPageSelected(int position) 
    position是被選中頁面的索引,該方法在頁面被選中或頁面滑動足夠距離切換到該頁手指擡起時呼叫。

三個方法的執行順序:用手指拖動翻頁時,最先執行一遍onPageScrollStateChanged(1),然後不斷執行onPageScrolled,放手指的時候,直接立即執行一次onPageScrollStateChanged(2),然後立即執行一次onPageSelected,然後再不斷執行onPageScrollStateChanged,最後執行一次onPageScrollStateChanged(0)

三種介面卡的使用及其主要方法詳解

三種介面卡繼承關係

這裡寫圖片描述

PagerAdapter
主要方法詳解
  • public abstract int getCount () 
    返回有效檢視的數量。
  • public int getItemPosition (Object object) 
    當宿主檢視嘗試判斷一項的位置是否改變時呼叫。如果給定項的位置沒有改變則返回POSITION_UNCHANGED,如果該項不再存在於介面卡中則返回POSITION_NONE。 
    在ViewPager.dataSetChanged()中將對該函式的返回值進行判斷,如果返回POSITION_NONE則呼叫destroyItem(ViewGroup container, int position, Object object)方法將該檢視銷燬,如果返回POSITION_UNCHANGED則不做任何改變,如果資料改變,則觸發PagerAdapter.instantiateItem(ViewGroup container, int position)方法改變檢視。 
    PagerAdapter中該方法的預設返回值是 POSITION_UNCHANGED。如果沒有過載該函式,而導致呼叫PagerAdapter.notifyDataSetChanged() 後,什麼都沒有發生。
  • public boolean isViewFromObject (View view, Object object) 
    決定一個頁面view是否與instantiateItem(ViewGroup, int)方法返回的具體key物件相關聯。 
    viewpager不直接處理每一個檢視而是將各個檢視與一個鍵聯絡起來。這個鍵用來跟蹤且唯一代表一個頁面,不僅如此,該鍵還獨立於這個頁面所在adapter的位置。當pageradapter將要改變的時候他會呼叫startUpdate函式,接下來會呼叫一次或多次的instantiateItem或者destroyItem。最後在更新的後期會呼叫finishUpdate。當finishUpdate返回時instantiateItem返回的物件應該新增到父ViewGroup,destroyItem返回的物件應該被ViewGroup刪除。isViewFromObject(View, Object)代表了當前的頁面是否與給定的鍵相關聯。 
    自定義Key示例-簡單的將位置position最為key
private class MyPagerAdapter extends PagerAdapter {

        private List<View> mViewList;

        MyPagerAdapter(List<View> viewList) {
            mViewList = viewList;
        }

        @Override
        public int getCount() {
            Log.i(TAG, NAME + "--getCount");
            return mViewList.size();
        }

        @Override
        public int getItemPosition(Object object) { 
            return super.getItemPosition(object);
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            Log.i(TAG, NAME + "--isViewFromObject");
            return view == mViewList.get((int)Integer.parseInt(object.toString()));
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View view = mViewList.get(position);
            container.addView(view);
            Log.i(TAG, NAME + "--instantiateItem++container:" + container.getChildCount() + "++position:" + position);
            return position;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView(mViewList.get(position));
            Log.i(TAG, NAME + "--destroyItem++container:" + container.getChildCount() + "++position:" + position);
        }

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • public Object instantiateItem (ViewGroup container, int position) 
    建立指定位置的頁面檢視。介面卡有責任增加即將建立的View檢視到給定的container中,確保在finishUpdate(viewGroup)返回時,增加檢視的事情已經完成。 
    該方法的返回值是新增檢視頁面的Object(Key),這裡沒必要非要返回檢視本身,也可以是這個頁面的其它容器,它可以返回和檢視相關聯的任何值。
  • public void destroyItem (ViewGroup container, int position, Object object) 
    移除給定位置的view,介面卡有責任將該view從container中移除,確保在finishUpdate(viewGroup)返回時,移除檢視的事情已經完成。
  • public void startUpdate (ViewGroup container) 
    在展示的介面中有改變將要發生時呼叫。
  • public void finishUpdate (ViewGroup container) 
    展示介面中的改變完成時呼叫。在這個時間點上,你必須確保所有的頁面已被合適的從container中新增或移除。
  • public void notifyDataSetChanged () 
    該方法由應用程式在介面卡資料改變時主動呼叫。
  • public void registerDataSetObserver (DataSetObserver observer) 
    註冊一個觀察者去接收關聯到介面卡資料變化的回撥。
  • public void unregisterDataSetObserver (DataSetObserver observer) 
    反註冊去接收關聯到介面卡資料變化的回撥的觀察者。
  • public void setPrimaryItem (ViewGroup container, int position, Object object) 
    呼叫該方法去通知當前介面卡的哪一項被考慮為“primary”,它是當前展示給使用者的頁面。
  • public CharSequence getPageTitle (int position) 
    該方法由ViewPager在獲取描述頁面的標題時呼叫。該方法預設返回null。
  • public float getPageWidth (int position) 
    該方法返回給定頁面的比例寬度,範圍(0.f-1.f]。
  • public Parcelable saveState () 
    儲存與介面卡關聯的例項狀態,噹噹前UI狀態需要重建時恢復。
  • public void restoreState (Parcelable state, ClassLoader loader) 
    恢復之前由saveState ()儲存的與介面卡關聯的例項狀態。
PagerAdapter使用示例

activity_pager_adapter.xml檔案

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.sunxiaodong.viewpager.PagerAdapterActivity">

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

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

    <TextView
        android:id="@+id/page_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:textColor="#ffffff"
        android:textSize="20sp" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true">

        <EditText
            android:id="@+id/edit_text"
            android:layout_width="100dp"
            android:layout_height="50dp"
            android:layout_gravity="center_vertical"
            android:textColor="#000000"
            android:textSize="20sp" />

        <Button
            android:id="@+id/button"
            android:layout_width="80dp"
            android:layout_height="40dp"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="10dp"
            android:text="跳轉"
            android:textColor="#ffffff" />
    </LinearLayout>

</RelativeLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

page1.xml檔案

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ff0000">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="page1"
        android:textColor="#ffffff"
        android:textSize="20sp" />

</RelativeLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

page2.xml檔案

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ff00ff">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="page2"
        android:textColor="#ffffff"
        android:textSize="20sp" />

</RelativeLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

page3.xml檔案

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#00ff00">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="page3"
        android:textColor="#ffffff"
        android:textSize="20sp" />

</RelativeLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

page4.xml檔案

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffff00">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        
            
           

相關推薦

ViewPager用法詳細解析

ViewPager詳解 ViewPager中的主要方法詳解OnPageChangeListener中的三個方法詳解三種介面卡的使用及其主要方法詳解 ViewPager用於實現頁面間的切換。 ViewPager中的主要方法詳解 setAdapter(PagerAdapter adap

大資料Hadoop中HDFS用法詳細解析

Hadoop–HDFS Edits和Fsimage機制詳解 概述 fsimage映象檔案包含了整個HDFS檔案系統的所有目錄和檔案的indoe(節點)資訊,比如:/node01/node,會記錄每個節點nodeid,以及節點之間父子路徑。 以及檔名,檔案大小,檔案被切成幾塊,每個資料塊描

Java開發Swing實戰JFrame和JTabbedPane容器的用法詳細解析

概述: 專案是一個桌面程式,涉及標籤和按鈕元件、佈局管理器元件、面板元件、列表框和下拉框元件等元件,以及Swing事件處理機制。 下面先從最基礎的介面開始。 /** @author: lishuai @date: 2018/11/26 13:51 */ public cl

Java開發中IO流的用法詳細解析

練習一:在Java程式設計裡統計一個檔案calcCharNum.txt中字母‘A’和’a’出現的總次數。 package com.test;import java.io.File; import java.io.FileInputStream; import java.io.FileNot

STL list連結串列的用法詳細解析

本文以List容器為例子,介紹了STL的基本內容,從容器到迭代器,再到普通函式,而且例子豐富,通俗易懂。不失為STL的入門文章,新手不容錯過!0 前言 1 定義一個list 2 使用list的成員函式push_back和push_front插入一個元素到list中 3

C++中函式模板的用法詳細解析

一、函式模板的產生原因: 函式的過載可以實現一個函式名多用,將功能相同或者類似函式用同一個名來定義。這樣可以簡化函式的呼叫形式,但是程式中,仍然需要分別定義每一個函式。那麼有什麼辦法可以讓我們少寫

C++ new的三種用法詳細解析

一. 簡介new有三種使用方式:plain new,nothrow new和placement new。(1)plain new顧名思義就是普通的new,就是我們慣常使用的new。在C++中是這樣定義的:    void* operator new(std::size_t)

Mount的用法詳細解析

cal 硬盤 文件系統類型 tlab 禁用 tar 之前 掛載點 lin 用法: mount [-lhV] mount -a [選項] mount [選項] [--source] <源> | [--target] <目錄> mount [選項] &l

Jquery的詳細解析用法

script size 過濾 css3 net spa code 選擇 web頁面 一、Jquery簡介 Jquery是一個優秀的Javascrīpt框架。它是輕量級的js庫(壓縮後只有21k) ,它兼容CSS3,還兼容各種瀏覽器 (IE 6.0+, FF 1.5+,

jQuery的詳細解析以及用法

jQueryjQuery是一個js庫,免費開源易用,提供了我們開發中常用到的操作DOM的API,解決了我們使用js操作DOM常遇到的一些問題,強大的選擇器,簡化我們的操作jQuery的特點:a. 輕量級b. 富應用c. DOM操作、事件處理、運動動畫、AJAXd. 跨瀏覽器(

redis配置詳細解析

keep turn name sort out 配置文件 trac lte eid # redis 配置文件示例 # 當你需要為某個配置項指定內存大小的時候,必須要帶上單位, # 通常的格式就是 1k 5gb 4m 等: # # 1k => 1000 bytes

CDN原理詳細解析

cdn dns負載均衡 文件分發網絡 1.用戶向瀏覽器輸入www.web.com這個域名,瀏覽器第一次發現本地沒有dns緩存,則向網站的DNS服務器請求;2.網站的DNS域名解析器設置了CNAME,指向了www.web.51cdn.com,請求指向了CDN網絡中的智能DNS負載均衡系統;3.智能D

_IO, _IOR, _IOW, _IOWR 宏的用法解析

內存 返回值 bits 分辨 上傳 正是 ron 了解 asm 今天在寫字符驅動驗證程序的時候要用到ioctl函數,其中有一個cmd參數,搞了半天也不了解是什麽意思,那個cmd還有什麽命令碼了什麽的,還好google下,覺得這篇文章寫的不錯,就轉來看看:在驅動程序裏, io

2017年軟考各科最新真題詳細解析資料集錦

軟考真題 軟考答案 軟考真題答案 軟考真題資料 軟考真題視頻 作為51CTO學院的軟考培訓講師,本著對廣大學員負責的態度,在每年同學們參加完軟考考試,我都會盡早的給大家發布各科的真題詳細解析資料。一方面是為了參加軟考考試的同學對自己考試情況做一個準確評估;另一方面是為未來參加軟考考試的學員

Linux top命令的用法詳細詳解

command load 命令 技術分享 服務 範圍 web服務器 睡眠狀態 打開 查看多核CPU命令mpstat -P ALL 和 sar -P ALL 說明:sar -P ALL > aaa.txt 重定向輸出內容到文件 aaa.txt top命令經

Android ViewPager用法小結

ext.get try mob too word shc 由於 tool 谷歌 android-support-v4.jar 是谷歌提供給我們的一個兼容低版本號安卓設備的軟件包。裏面包囊了僅僅有在 Android 3.0 以上可用的API。而 ViewP

redis.conf配置詳細解析

tip soft notify cross following 模板 guarantee use fast # redis 配置文件示例 # 當你需要為某個配置項指定內存大小的時候,必須要帶上單位, # 通常的格式就是 1k 5gb 4m 等醬紫: # # 1k =&

MySql之ALTER命令用法詳細解讀(轉)

修改表 pre const 命令使用 add ear 修改 blog rain 本文詳細解讀了MySql語法中Alter命令的用法,這是一個用法比較多的語法,而且功能還是很強大的。 USE learning;(自己要提前建好) CREATE TABLE student

前端【響應式】開發詳細解析

響應式設計 針對 標簽 ipad rem img ons 微信公眾 dev 一、響應式設計需要解決的問題是什麽? 針對目前大家常見的固定布局、自適應布局都是一種反應遲鈍的web設計,當Web頁面需要在各種顯示屏顯示時,他們就顯得力不從心了。因此,我們就需要相應設計。 優勢:

vue-cli中的build.js配置文件詳細解析

刪除 .json directory 內置 tostring file 環境配置 輸出 pin 轉載自:https://www.cnblogs.com/ye-hcj/p/7096341.html這是vue-cli腳手架工具的生產環境配置入口 package.json中的"b