ViewPagerWithImageDemo【ViewPager如何判斷滑動到第一頁和最後一頁以及彈出對話框功能】

版權聲明:本文爲HaiyuKing原創文章,轉載請註明出處!html

前言

記錄viewpager滑動的時候彈出對話框的功能(關鍵功能是滑動彈出對話框後,隱藏對話框的時候當前頁能夠還原到原位置),順便判斷首頁和最後一頁。java

效果圖

代碼分析

實現滑動後彈出對話框,而後對話框隱藏後當前頁面還原到原位置的功能,關鍵代碼以下:android

/**ViewPage切換的事件監聽
     * http://blog.csdn.net/zhengxiaoyao0716/article/details/48805703*/
    public class MyOnPageChangeListener implements ViewPager.OnPageChangeListener
    {
        private boolean isNormalChange = false;//標明是否普通的上翻頁和下翻頁【默認爲false,標明須要判斷而後彈出對話框】
        private int resetXPoint = 0;//獲取彈出對話框,還原的scrollTo的X座標值,默認是0.打開的是第幾頁,好比,若是是第二頁,那麼第二頁的X座標是0 + (2-1)*viwepager的寬度

        /* 這個方法在手指操做屏幕的時候發生變化。有三個值:0(END),1(PRESS) , 2(UP) 。
         * arg0 ==1的時辰默示正在滑動,arg0==2的時辰默示滑動完畢了,arg0==0的時辰默示什麼都沒作。
         */
        @Override
        public void onPageScrollStateChanged(int state) {
            if(state == 1){
                isNormalChange = false;
            }
        }

        /* 用戶一次滑動,這個方法會持續調用N屢次,直至某個View充滿視圖而且穩定住!(但具體調用次數也不肯定,尤爲在首末位置向邊界滑動,若是Log一下,會看到出現調用不肯定次數的打印,且positionOffset都爲0.
         * position 當前頁面,及你點擊滑動的頁面【position爲當前屏幕上所露出的全部View的Item取下限。好比,當前Item爲3,輕輕向右滑動一下,2露出了一點點,那麼position就是2;而若是向左滑動,露出的4比3大,那麼只要3沒徹底隱匿,那麼position就一直按照3算。】
         * positionOffset 當前頁面偏移的百分比【positionOffset是當前Item較大的那個View佔視圖的百分比,0-1,沒有負數!當滑動結束時,onPageScrolled();最後一次調用,positionOffset爲0。】
         * positionOffsetPixels 當前頁面偏移的像素位置
         */
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            //這裏獲取第一個值,用來判斷是左滑仍是右滑(若是viewpager的寬度 - positionOffsetPixels <= viewpager的寬度的一半,則表明往左滑動(上一頁),反之右滑(下一頁))
            /*int positionOffsetPixelsTemp =  - positionOffsetPixels;//獲取須要偏移的數值(默認獲取的是往右滑(下一頁)的狀況下的偏移值)
            int viewPagerWidth = mViewPager.getWidth();
            if(viewPagerWidth - positionOffsetPixels <= viewPagerWidth / 2){
                positionOffsetPixelsTemp = viewPagerWidth - positionOffsetPixels;
            }*/


            /*
             * 當第一頁上翻頁時:position = 0;currentItemIndex=0;positionOffset=0.0;positionOffsetPixels=0
             * 普通上翻頁時:position = 0;currentItemIndex=1-->0;positionOffset==0.99224806-->0.0;positionOffsetPixels=1024-->0
             * 當最後一頁下翻頁時:position = 10;currentItemIndex=10;positionOffset=0.0;positionOffsetPixels=0
             * 普通下翻頁時:position = 9;currentItemIndex=9-->10;positionOffset=0.041666985-->0.9-->0.0;positionOffsetPixels=43-->1024-->0
             * */

            if(! isNormalChange){

                if(position == mPictureBeanList.size() - 1 && position ==currentItemIndex && positionOffset == 0.0 && positionOffsetPixels == 0){
                    //在最後一頁進行滑動
                }else if(position == 0 && position ==currentItemIndex && positionOffset == 0.0 && positionOffsetPixels == 0){
                    //在第一頁進行滑動
                }else {
                    //判斷是否數據(例如,標題)發生了改變,若是發生了改變,那麼彈出對話框
                    PictureBean picBean = mPictureBeanList.get(currentItemIndex);
                    String oldPicTitle = picBean.getPicTitle();//舊的圖片標題
                    String newPicTitle = mPicTitleEdt.getText().toString();//新的圖片標題

                    boolean changed = newPicTitle.equals(oldPicTitle);

                    if (changed) {
                        isNormalChange = true;//【若是數據沒有發生改變,則表明是正常滑動】
                    }else{
                        mViewPager.setIsCanScroll(false);//禁止滑動
                        //彈出提示對話框
                        // 建立構建器
                        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
                        // 設置參數
                        builder.setTitle("提示")
                                .setMessage("標題發生了改變,是否保存?")
                                .setPositiveButton("保存", new DialogInterface.OnClickListener() {// 積極
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        // TODO Auto-generated method stub
                                        mViewPager.setIsCanScroll(true);//容許滑動
                                        mViewPager.scrollTo(resetXPoint,0);
                                        uploadImgTitle();
                                    }
                                }).setNegativeButton("不保存", new DialogInterface.OnClickListener() {// 消極
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // TODO Auto-generated method stub
                                mViewPager.setIsCanScroll(true);//容許滑動
                                mViewPager.scrollTo(resetXPoint,0); //還原標題
                                PictureBean pictureBean = mPictureBeanList.get(currentItemIndex);
                                mPicTitleEdt.setText(pictureBean.getPicTitle());
                            }
                        }).setOnDismissListener(new DialogInterface.OnDismissListener() {
                            @Override
                            public void onDismiss(DialogInterface dialogInterface) {
                                mViewPager.setIsCanScroll(true);//容許滑動
                                mViewPager.scrollTo(resetXPoint,0);
                            }
                        });
                        builder.create().show();
                    }
                }
            }
        }

        /* 這個方法有一個參數position,表明哪一個頁面被選中。
         * 當用手指滑動翻頁的時候,若是翻動成功了(滑動的距離夠長),手指擡起來就會當即執行這個方法
         * position就是當前滑動到的頁面。
         * 若是直接setCurrentItem翻頁,那position就和setCurrentItem的參數一致,這種狀況在onPageScrolled執行方法前就會當即執行。
         */
        @Override
        public void onPageSelected(int position) {
            Log.w("why", "{MyOnPageChangeListener}{onPageSelected}position="+position);
            Log.w("why", "{MyOnPageChangeListener}{onPageSelected}currentItemIndex="+currentItemIndex);
            resetXPoint = resetXPoint + (position - currentItemIndex) * mViewPager.getWidth();
            currentItemIndex = position;
            showPageNum();//設置頁碼
        }
    }

使用步驟

1、項目組織結構圖

注意事項:git

一、  導入類文件後須要change包名以及從新import R文件路徑github

二、  Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),若是項目中存在,則複製裏面的內容,不要整個覆蓋app

2、導入步驟

(1)實現ViewpAger基礎框架搭建

一、將MyCustomViewPager複製到項目中框架

package com.why.project.viewpagerwithimagedemo.viewpager;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/**
 * Created by HaiyuKing
 * Used 自定義的viewpager
 * https://www.cnblogs.com/tangs/articles/5933233.html
 * 解決切換須要通過中間頁的問題;
 * 實現控制viewpager是否可滑動;
 * 解決視頻播放器和viewpager滑動衝突問題【可擴展到任何view】;
 */

public class MyCustomViewPager extends ViewPager {

    /**是否能夠滑動:默承認以滑動*/
    private boolean isCanScroll = true;

    public MyCustomViewPager(Context context) {
        super(context);
    }

    public MyCustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * 解決切換須要通過中間頁
     */
    @Override
    public void setCurrentItem(int item) {
        //super.setCurrentItem(item);源碼
        super.setCurrentItem(item,false);//smoothScroll false表示切換的時候,不通過兩個頁面的中間頁
    }

    /**
     * 讓ViewPager不能左右滑動
     */
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if(isCanScroll){
            return super.onTouchEvent(ev);
        }else{
            return false;
        }
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if(isCanScroll){
            return super.onInterceptTouchEvent(ev);
        }else{
            return false;
        }
    }

    /**
     * 暴露出去的方法,屏蔽ViewPager的滑動,默認不可滑動
     * @param isCanScroll 爲true能夠左右滑動,爲false不可滑動
     */
    public void setIsCanScroll(boolean isCanScroll){
        this.isCanScroll = isCanScroll;
    }

    @Override
    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {

        /*if (v instanceof IjkVideoView) {//解決視頻播放器和viewpager滑動衝突問題
            return true;
        }*/
        return super.canScroll(v, checkV, dx, x, y);
    }
}
MyCustomViewPager.java

二、在activity佈局文件中引用MyCustomViewPager【注意,MyCustomViewPager的完整路徑須要根據實際狀況修改ide

<?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="match_parent"
    android:orientation="vertical"
    android:padding="8dp">

    <!-- viewpager區域 -->
    <com.why.project.viewpagerwithimagedemo.viewpager.MyCustomViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="0.0dp" android:layout_weight="1" android:clipChildren="false" android:background="#ffffff" android:layout_marginBottom="8dp"/>

    <EditText android:id="@+id/edt_title" android:layout_width="match_parent" android:layout_height="48dp"/>

    <TextView android:id="@+id/tv_page" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" android:layout_gravity="center"/>

</LinearLayout>

三、編寫viewpager內部的佈局view_pager_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/img_pic"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:contentDescription="@string/app_name"
    android:gravity="center"
    android:src="@drawable/img_default"
    android:scaleType="fitCenter"
    android:background="#343434"
    />

四、添加集合item的bean類PictureBean

package com.why.project.viewpagerwithimagedemo.bean;

/**
 * Created by HaiyuKing
 * Used
 */

public class PictureBean {
    //圖片ID值
    private String picId = "";
    //圖片的res id值【這裏模擬的是圖片的url地址,因此使用的res id值進行代替】
    private int picResId = 0;
    //圖片標題
    private String picTitle = "";

    public String getPicId() {
        return picId;
    }

    public void setPicId(String picId) {
        this.picId = picId;
    }

    public int getPicResId() {
        return picResId;
    }

    public void setPicResId(int picResId) {
        this.picResId = picResId;
    }

    public String getPicTitle() {
        return picTitle;
    }

    public void setPicTitle(String picTitle) {
        this.picTitle = picTitle;
    }
}
PictureBean.java

將演示用的圖片資源複製到項目中佈局

五、在activity中初始化viewpager並關聯佈局文件和集合數據【這只是一個基礎的框架,後續還須要繼續完善ui

package com.why.project.viewpagerwithimagedemo;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import com.why.project.viewpagerwithimagedemo.bean.PictureBean;
import com.why.project.viewpagerwithimagedemo.viewpager.MyCustomViewPager;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private Context mContext;

    private EditText mPicTitleEdt;
    private TextView mPageTv;

    /**中間viewpager區域*/
    private MyCustomViewPager mViewPager; /**ViewPager適配器*/
    private MyViewPagerAdapter mViewPageAdapter; //viewpager的數據集合
    private ArrayList<PictureBean> mPictureBeanList; /**viewpager中當前頁面的下標值*/
    private int currentItemIndex = 0;

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

        mContext = this;

        //初始化控件以及設置
        initView();
        //初始化數據
        initData();
        //初始化控件的點擊事件
        initEvent();
    }

    @Override
    public void onDestroy() {
        mViewPager.removeAllViews();//防止內存泄漏
        System.gc();//回收

        super.onDestroy();
    }

    private void initView() {
        mPicTitleEdt = findViewById(R.id.edt_title);
        mPageTv = findViewById(R.id.tv_page);

        mViewPager = (MyCustomViewPager) findViewById(R.id.view_pager); mViewPager.setOffscreenPageLimit(3);//設置預加載的頁數,以前是3【這個值指的是,當前view的左右兩邊的預加載的頁面的個數。也就是說,若是這個值mOffscreenPageLimit = 3,那麼任何一個頁面的左邊能夠預加載3個頁面,右邊也能夠加載3頁面。】
    }

    private void initData() {
        //初始化數據
        mPictureBeanList = new ArrayList<PictureBean>();
        PictureBean bean0 = new PictureBean();
        bean0.setPicId("pic0");
        bean0.setPicTitle("圖片1");
        bean0.setPicResId(R.drawable.pic_0);
        mPictureBeanList.add(bean0);
        //
        PictureBean bean1 = new PictureBean();
        bean1.setPicId("pic1");
        bean1.setPicTitle("圖片2");
        bean1.setPicResId(R.drawable.pic_1);
        mPictureBeanList.add(bean1);
        //
        PictureBean bean2 = new PictureBean();
        bean2.setPicId("pic0");
        bean2.setPicTitle("圖片3");
        bean2.setPicResId(R.drawable.pic_2);
        mPictureBeanList.add(bean2);
        //
        PictureBean bean3 = new PictureBean();
        bean3.setPicId("pic3");
        bean3.setPicTitle("圖片4");
        bean3.setPicResId(R.drawable.pic_3);
        mPictureBeanList.add(bean3);

        //設置頁碼
        if(mPictureBeanList.size() > 0){ showPageNum(); } //填充viewpager數據
        initViewPage();
    }

    private void initEvent() {

    }

    //設置頁碼和標題輸入框
    private void showPageNum() {
        mPageTv.setText((currentItemIndex+1) + "/" + mPictureBeanList.size());

        String picTitle = mPictureBeanList.get(currentItemIndex).getPicTitle();
        mPicTitleEdt.setText(picTitle);
    }

    /**初始化viewpager配置*/
    private void initViewPage(){
        if(mViewPageAdapter == null){ mViewPageAdapter = new MyViewPagerAdapter(); mViewPager.setAdapter(mViewPageAdapter); mViewPager.addOnPageChangeListener(new MyOnPageChangeListener());//設置頁面切換監聽事件
            mViewPager.setIsCanScroll(true);//容許滑動
        }else{ mViewPageAdapter.notifyDataSetChanged(); } mViewPager.setCurrentItem(currentItemIndex);
    }

    /**ViewPager適配器*/
    public class MyViewPagerAdapter extends PagerAdapter
    {
        /**這個方法,是從ViewGroup中移出當前View*/
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView(((View)object));
        }

        /**這個方法,是獲取viewpager的界面數*/
        @Override
        public int getCount() {
            return mPictureBeanList.size();
        }


        public int getItemPosition(Object object) {
            return POSITION_NONE;//-2
        }

        /**這個方法,return一個對象,這個對象代表了PagerAdapter將選擇將這個對象填充到在當前ViewPager裏*/
        @Override
        public Object instantiateItem(ViewGroup container, int position){
            View layout = LayoutInflater.from(mContext).inflate(R.layout.view_pager_layout, null);//將佈局文件view添加到viewpager中
            container.addView((View)layout);

            ImageView mPicImgView = layout.findViewById(R.id.img_pic);
            mPicImgView.setImageResource(mPictureBeanList.get(position).getPicResId());

            return layout;
        }

        /**這個方法,在幫助文檔中原文是could be implemented as return view == object,也就是用於判斷是否由對象生成界面*/
        @Override
        public boolean isViewFromObject(View view, Object object) {
            // TODO Auto-generated method stub
            return view == object ? true : false;//官方提示這樣寫
        }
        @Override
        public void notifyDataSetChanged()
        {
            super.notifyDataSetChanged();
        }
    }

    /**ViewPage切換的事件監聽
     * http://blog.csdn.net/zhengxiaoyao0716/article/details/48805703*/
    public class MyOnPageChangeListener implements ViewPager.OnPageChangeListener
    {
        /* 這個方法在手指操做屏幕的時候發生變化。有三個值:0(END),1(PRESS) , 2(UP) 。
         * arg0 ==1的時辰默示正在滑動,arg0==2的時辰默示滑動完畢了,arg0==0的時辰默示什麼都沒作。
         */
        @Override
        public void onPageScrollStateChanged(int state) {
        }

        /* 用戶一次滑動,這個方法會持續調用N屢次,直至某個View充滿視圖而且穩定住!(但具體調用次數也不肯定,尤爲在首末位置向邊界滑動,若是Log一下,會看到出現調用不肯定次數的打印,且positionOffset都爲0.
         * position 當前頁面,及你點擊滑動的頁面【position爲當前屏幕上所露出的全部View的Item取下限。好比,當前Item爲3,輕輕向右滑動一下,2露出了一點點,那麼position就是2;而若是向左滑動,露出的4比3大,那麼只要3沒徹底隱匿,那麼position就一直按照3算。】
         * positionOffset 當前頁面偏移的百分比【positionOffset是當前Item較大的那個View佔視圖的百分比,0-1,沒有負數!當滑動結束時,onPageScrolled();最後一次調用,positionOffset爲0。】
         * positionOffsetPixels 當前頁面偏移的像素位置
         */
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

        /* 這個方法有一個參數position,表明哪一個頁面被選中。
         * 當用手指滑動翻頁的時候,若是翻動成功了(滑動的距離夠長),手指擡起來就會當即執行這個方法
         * position就是當前滑動到的頁面。
         * 若是直接setCurrentItem翻頁,那position就和setCurrentItem的參數一致,這種狀況在onPageScrolled執行方法前就會當即執行。
         */
        @Override
        public void onPageSelected(int position) {
            currentItemIndex = position; showPageNum();//設置頁碼
        }
    }
}

(2)實現滑動彈出對話框功能

package com.why.project.viewpagerwithimagedemo;

import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import com.why.project.viewpagerwithimagedemo.bean.PictureBean;
import com.why.project.viewpagerwithimagedemo.viewpager.MyCustomViewPager;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private Context mContext;

    private EditText mPicTitleEdt;
    private TextView mPageTv;

    /**中間viewpager區域*/
    private MyCustomViewPager mViewPager;
    /**ViewPager適配器*/
    private MyViewPagerAdapter mViewPageAdapter;
    //viewpager的數據集合
    private ArrayList<PictureBean> mPictureBeanList;
    /**viewpager中當前頁面的下標值*/
    private int currentItemIndex = 0;

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

        mContext = this;

        //初始化控件以及設置
        initView();
        //初始化數據
        initData();
        //初始化控件的點擊事件
        initEvent();
    }

    @Override
    public void onDestroy() {
        mViewPager.removeAllViews();//防止內存泄漏
        System.gc();//回收

        super.onDestroy();
    }

    private void initView() {
        mPicTitleEdt = findViewById(R.id.edt_title);
        mPageTv = findViewById(R.id.tv_page);

        mViewPager = (MyCustomViewPager) findViewById(R.id.view_pager);
        mViewPager.setOffscreenPageLimit(3);//設置預加載的頁數,以前是3【這個值指的是,當前view的左右兩邊的預加載的頁面的個數。也就是說,若是這個值mOffscreenPageLimit = 3,那麼任何一個頁面的左邊能夠預加載3個頁面,右邊也能夠加載3頁面。】
    }

    private void initData() {
        //初始化數據
        mPictureBeanList = new ArrayList<PictureBean>();
        PictureBean bean0 = new PictureBean();
        bean0.setPicId("pic0");
        bean0.setPicTitle("圖片1");
        bean0.setPicResId(R.drawable.pic_0);
        mPictureBeanList.add(bean0);
        //
        PictureBean bean1 = new PictureBean();
        bean1.setPicId("pic1");
        bean1.setPicTitle("圖片2");
        bean1.setPicResId(R.drawable.pic_1);
        mPictureBeanList.add(bean1);
        //
        PictureBean bean2 = new PictureBean();
        bean2.setPicId("pic0");
        bean2.setPicTitle("圖片3");
        bean2.setPicResId(R.drawable.pic_2);
        mPictureBeanList.add(bean2);
        //
        PictureBean bean3 = new PictureBean();
        bean3.setPicId("pic3");
        bean3.setPicTitle("圖片4");
        bean3.setPicResId(R.drawable.pic_3);
        mPictureBeanList.add(bean3);

        //設置頁碼
        if(mPictureBeanList.size() > 0){
            showPageNum();
        }
        //填充viewpager數據
        initViewPage();
    }

    private void initEvent() {

    }

    //設置頁碼和標題輸入框
    private void showPageNum() {
        mPageTv.setText((currentItemIndex+1) + "/" + mPictureBeanList.size());

        String picTitle = mPictureBeanList.get(currentItemIndex).getPicTitle();
        mPicTitleEdt.setText(picTitle);
    }

    /**初始化viewpager配置*/
    private void initViewPage(){
        if(mViewPageAdapter == null){
            mViewPageAdapter = new MyViewPagerAdapter();
            mViewPager.setAdapter(mViewPageAdapter);

            mViewPager.addOnPageChangeListener(new MyOnPageChangeListener());//設置頁面切換監聽事件
            mViewPager.setIsCanScroll(true);//容許滑動
        }else{
            mViewPageAdapter.notifyDataSetChanged();
        }
        mViewPager.setCurrentItem(currentItemIndex);
    }

    /**ViewPager適配器*/
    public class MyViewPagerAdapter extends PagerAdapter
    {
        /**這個方法,是從ViewGroup中移出當前View*/
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView(((View)object));
        }

        /**這個方法,是獲取viewpager的界面數*/
        @Override
        public int getCount() {
            return mPictureBeanList.size();
        }


        public int getItemPosition(Object object) {
            return POSITION_NONE;//-2
        }

        /**這個方法,return一個對象,這個對象代表了PagerAdapter將選擇將這個對象填充到在當前ViewPager裏*/
        @Override
        public Object instantiateItem(ViewGroup container, int position){
            View layout = LayoutInflater.from(mContext).inflate(R.layout.view_pager_layout, null);//將佈局文件view添加到viewpager中
            container.addView((View)layout);

            ImageView mPicImgView = layout.findViewById(R.id.img_pic);
            mPicImgView.setImageResource(mPictureBeanList.get(position).getPicResId());

            return layout;
        }

        /**這個方法,在幫助文檔中原文是could be implemented as return view == object,也就是用於判斷是否由對象生成界面*/
        @Override
        public boolean isViewFromObject(View view, Object object) {
            // TODO Auto-generated method stub
            return view == object ? true : false;//官方提示這樣寫
        }
        @Override
        public void notifyDataSetChanged()
        {
            super.notifyDataSetChanged();
        }
    }

    /**ViewPage切換的事件監聽
     * http://blog.csdn.net/zhengxiaoyao0716/article/details/48805703*/
    public class MyOnPageChangeListener implements ViewPager.OnPageChangeListener
    {
        private boolean isNormalChange = false;//標明是否普通的上翻頁和下翻頁【默認爲false,標明須要判斷而後彈出對話框】
        private int resetXPoint = 0;//獲取彈出對話框,還原的scrollTo的X座標值,默認是0.打開的是第幾頁,好比,若是是第二頁,那麼第二頁的X座標是0 + (2-1)*viwepager的寬度

        /* 這個方法在手指操做屏幕的時候發生變化。有三個值:0(END),1(PRESS) , 2(UP) 。
         * arg0 ==1的時辰默示正在滑動,arg0==2的時辰默示滑動完畢了,arg0==0的時辰默示什麼都沒作。
         */
        @Override
        public void onPageScrollStateChanged(int state) {
            if(state == 1){ isNormalChange = false; }
        }

        /* 用戶一次滑動,這個方法會持續調用N屢次,直至某個View充滿視圖而且穩定住!(但具體調用次數也不肯定,尤爲在首末位置向邊界滑動,若是Log一下,會看到出現調用不肯定次數的打印,且positionOffset都爲0.
         * position 當前頁面,及你點擊滑動的頁面【position爲當前屏幕上所露出的全部View的Item取下限。好比,當前Item爲3,輕輕向右滑動一下,2露出了一點點,那麼position就是2;而若是向左滑動,露出的4比3大,那麼只要3沒徹底隱匿,那麼position就一直按照3算。】
         * positionOffset 當前頁面偏移的百分比【positionOffset是當前Item較大的那個View佔視圖的百分比,0-1,沒有負數!當滑動結束時,onPageScrolled();最後一次調用,positionOffset爲0。】
         * positionOffsetPixels 當前頁面偏移的像素位置
         */
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            //這裏獲取第一個值,用來判斷是左滑仍是右滑(若是viewpager的寬度 - positionOffsetPixels <= viewpager的寬度的一半,則表明往左滑動(上一頁),反之右滑(下一頁))
            /*int positionOffsetPixelsTemp =  - positionOffsetPixels;//獲取須要偏移的數值(默認獲取的是往右滑(下一頁)的狀況下的偏移值)
            int viewPagerWidth = mViewPager.getWidth();
            if(viewPagerWidth - positionOffsetPixels <= viewPagerWidth / 2){
                positionOffsetPixelsTemp = viewPagerWidth - positionOffsetPixels;
            }*/


            /*
             * 當第一頁上翻頁時:position = 0;currentItemIndex=0;positionOffset=0.0;positionOffsetPixels=0
             * 普通上翻頁時:position = 0;currentItemIndex=1-->0;positionOffset==0.99224806-->0.0;positionOffsetPixels=1024-->0
             * 當最後一頁下翻頁時:position = 10;currentItemIndex=10;positionOffset=0.0;positionOffsetPixels=0
             * 普通下翻頁時:position = 9;currentItemIndex=9-->10;positionOffset=0.041666985-->0.9-->0.0;positionOffsetPixels=43-->1024-->0
             * */

            if(! isNormalChange){

                if(position == mPictureBeanList.size() - 1 && position ==currentItemIndex && positionOffset == 0.0 && positionOffsetPixels == 0){
                    //在最後一頁進行滑動
                }else if(position == 0 && position ==currentItemIndex && positionOffset == 0.0 && positionOffsetPixels == 0){
                    //在第一頁進行滑動
                }else {
                    //判斷是否數據(例如,標題)發生了改變,若是發生了改變,那麼彈出對話框
                    PictureBean picBean = mPictureBeanList.get(currentItemIndex);
                    String oldPicTitle = picBean.getPicTitle();//舊的圖片標題
                    String newPicTitle = mPicTitleEdt.getText().toString();//新的圖片標題

                    boolean changed = newPicTitle.equals(oldPicTitle);

                    if (changed) { isNormalChange = true;//【若是數據沒有發生改變,則表明是正常滑動】
                    }else{
                        mViewPager.setIsCanScroll(false);//禁止滑動 //彈出提示對話框 // 建立構建器
                        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
                        // 設置參數
                        builder.setTitle("提示")
                                .setMessage("標題發生了改變,是否保存?")
                                .setPositiveButton("保存", new DialogInterface.OnClickListener() {// 積極
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        // TODO Auto-generated method stub
                                        mViewPager.setIsCanScroll(true);//容許滑動
                                        mViewPager.scrollTo(resetXPoint,0); uploadImgTitle();
                                    }
                                }).setNegativeButton("不保存", new DialogInterface.OnClickListener() {// 消極
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // TODO Auto-generated method stub
                                mViewPager.setIsCanScroll(true);//容許滑動
                                mViewPager.scrollTo(resetXPoint,0); //還原標題
                                PictureBean pictureBean = mPictureBeanList.get(currentItemIndex); mPicTitleEdt.setText(pictureBean.getPicTitle());
                            }
                        }).setOnDismissListener(new DialogInterface.OnDismissListener() {
                            @Override
                            public void onDismiss(DialogInterface dialogInterface) {
                                mViewPager.setIsCanScroll(true);//容許滑動
                                mViewPager.scrollTo(resetXPoint,0);
                            }
                        });
                        builder.create().show();
                    }
                }
            }
        }

        /* 這個方法有一個參數position,表明哪一個頁面被選中。
         * 當用手指滑動翻頁的時候,若是翻動成功了(滑動的距離夠長),手指擡起來就會當即執行這個方法
         * position就是當前滑動到的頁面。
         * 若是直接setCurrentItem翻頁,那position就和setCurrentItem的參數一致,這種狀況在onPageScrolled執行方法前就會當即執行。
         */
        @Override
        public void onPageSelected(int position) {
            Log.w("why", "{MyOnPageChangeListener}{onPageSelected}position="+position);
            Log.w("why", "{MyOnPageChangeListener}{onPageSelected}currentItemIndex="+currentItemIndex);
            resetXPoint = resetXPoint + (position - currentItemIndex) * mViewPager.getWidth(); currentItemIndex = position; showPageNum();//設置頁碼
        }
    }

    //更新圖片標題
    private void uploadImgTitle(){
        PictureBean picBean = mPictureBeanList.get(currentItemIndex);
        picBean.setPicTitle(mPicTitleEdt.getText().toString());
    }
}

混淆配置

參考資料

暫時空缺

項目demo下載地址

https://github.com/haiyuKing/ViewPagerWithImageDemo

相關文章
相關標籤/搜索