ViewPagerWithViewDemo【ViewPager和View搭配以及演示獲取裏面的值和CheckBox單選效果】

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

前言

簡單記錄下ViewPager和自定義佈局view的搭配使用以及佈局文件中單選效果、獲取viewpager佈局內部值的功能。android

效果圖

使用步驟

1、項目組織結構圖

注意事項:git

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

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

2、導入步驟

(1)將ViewPager和內部佈局文件以及數據集合關聯起來

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

package com.why.project.viewpagerwithviewdemo;

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.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.TextView;

import com.why.project.viewpagerwithviewdemo.bean.CheckInfoBean;
import com.why.project.viewpagerwithviewdemo.viewpager.MyCustomViewPager;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private Context mContext;

    private TextView mPageTv;

    /**中間viewpager區域*/
    private MyCustomViewPager mViewPager;
    /**ViewPager適配器*/
    private MyViewPagerAdapter mViewPageAdapter;
    //viewpager的數據集合
    private ArrayList<CheckInfoBean> mCheckInfoLists;
    /**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() {
        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() {
        //初始化數據
        mCheckInfoLists = new ArrayList<CheckInfoBean>();
        for (int i=0;i<10;i++){
            CheckInfoBean bean = new CheckInfoBean();
            bean.setCheckResult("1");
            bean.setCheckContent("這是第" + (i+1) + "頁");
            mCheckInfoLists.add(bean);
        }

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

    private void initEvent() {

    }

    //設置頁碼
    private void showPageNum() {
        mPageTv.setText((currentItemIndex+1) + "/" + mCheckInfoLists.size());
    }

    /**初始化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 mCheckInfoLists.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);

            EditText edt_content = layout.findViewById(R.id.edt_content);

            //實例化控件
            CheckBox mHegeCB = layout.findViewById(R.id.cb_hege);
            CheckBox mYanZhongCB = layout.findViewById(R.id.cb_yanzhong);
            CheckBox mZhuYaoCB = layout.findViewById(R.id.cb_zhuyao);
            CheckBox mYiBanCB = layout.findViewById(R.id.cb_yiban);

            //將四個CheckBox放到集合中,用於控制單選規則【下標值按照一、二、三、4與合格。嚴重,主要,通常的規則排列】
            final ArrayList<CheckBox> mResultRadioList = new ArrayList<CheckBox>();
            mResultRadioList.add(mHegeCB);
            mResultRadioList.add(mYanZhongCB);
            mResultRadioList.add(mZhuYaoCB);
            mResultRadioList.add(mYiBanCB);

            //填充數據
            CheckInfoBean checkInfoBean = mCheckInfoLists.get(position);
            edt_content.setText(checkInfoBean.getCheckContent());

            String resultIndex = checkInfoBean.getCheckResult();
            if(! TextUtils.isEmpty(resultIndex) && Integer.parseInt(resultIndex) > 0){
                mResultRadioList.get(Integer.parseInt(resultIndex) - 1).setChecked(true);
            }

            //設置點擊事件
            for(int i=0;i<mResultRadioList.size();i++){
                final int ckIndex = i;
                mResultRadioList.get(i).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                        if(isChecked){
                            //循環mResultRadioList集合,還原其餘radio不選中狀態
                            for(CheckBox radioBtn : mResultRadioList){
                                if(radioBtn != mResultRadioList.get(ckIndex)){
                                    radioBtn.setChecked(false);
                                }
                            }
                        }
                    }
                });
            }

            //將佈局文件view添加到viewpager中
            container.addView((View)layout);

            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();//設置頁碼
        }
    }


}
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">

    <Button
        android:id="@+id/btn_save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="獲取當前頁中的值"
        android:layout_marginBottom="8dp"
        android:layout_gravity="center"/>

    <!-- viewpager區域 -->
    <com.why.project.viewpagerwithviewdemo.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"/>

    <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"?>
<!-- viewpager區域的佈局文件 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#ffffff" >

    <!--  當之有一個EditText或者AutoCompleteTextView的時候,進入畫面時是默認獲得焦點的。 要想去除焦點,能夠在auto以前加一個0像素的layout,並設置他先獲得焦點。 -->
    <LinearLayout
        android:layout_width="0px"
        android:layout_height="0px"
        android:focusable="true"
        android:focusableInTouchMode="true"/>

    <!-- 設置區域:可滑動 -->
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbarSize="2dp"
        android:scrollbarThumbVertical="@null"
        android:scrollbars="vertical"
        >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            >

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="檢查結果:"
                android:textColor="#87000000"
                android:textSize="18sp"/>

            <!-- 檢查結果 -->
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:layout_margin="8dp"
                >

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal"
                    android:layout_marginBottom="8dp">
                    <LinearLayout
                        android:layout_width="0.0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:orientation="horizontal">
                        <!-- 合格 -->
                        <CheckBox
                            android:id="@+id/cb_hege"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:button="@null"
                            android:drawableLeft="@drawable/check_info_radio"
                            android:text="合格"
                            android:textSize="16sp"/>
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="0.0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:orientation="horizontal">
                        <!-- 嚴重問題 -->
                        <CheckBox
                            android:id="@+id/cb_yanzhong"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:button="@null"
                            android:drawableLeft="@drawable/check_info_radio"
                            android:text="嚴重問題"
                            android:textSize="16sp"/>
                    </LinearLayout>
                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal">
                    <LinearLayout
                        android:layout_width="0.0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:orientation="horizontal">
                        <!-- 主要問題 -->
                        <CheckBox
                            android:id="@+id/cb_zhuyao"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:button="@null"
                            android:drawableLeft="@drawable/check_info_radio"
                            android:text="主要問題"
                            android:textSize="16sp"/>
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="0.0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:orientation="horizontal">
                        <!-- 通常問題 -->
                        <CheckBox
                            android:id="@+id/cb_yiban"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:button="@null"
                            android:drawableLeft="@drawable/check_info_radio"
                            android:text="通常問題"
                            android:textSize="16sp"/>
                    </LinearLayout>
                </LinearLayout>

            </LinearLayout>

            <!-- 備註 -->
            <EditText
                android:id="@+id/et_content"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="請輸入備註"
                android:inputType="textMultiLine"
                android:minLines="3"
                android:maxLines="5"
                android:text=""
                android:textColor="#54000000"
                android:textSize="16sp"
                android:textColorHint="#54000000"
                android:gravity="top"
                />

        </LinearLayout>
    </ScrollView>

</LinearLayout>
view_pager_layout.xml

四、添加集合item的bean類CheckInfoBean

package com.why.project.viewpagerwithviewdemo.bean;

/**
 * Created by HaiyuKing
 * Used 檢查結果bean類
 */

public class CheckInfoBean {
    /**檢查結果【檢查結果:一、二、三、4與合格。嚴重,主要,通常。-1表明未檢查】*/
    private String checkResult;
    /**檢查說明*/
    private String checkContent;

    public String getCheckResult() {
        return checkResult;
    }

    public void setCheckResult(String checkResult) {
        this.checkResult = checkResult;
    }

    public String getCheckContent() {
        return checkContent;
    }

    public void setCheckContent(String checkContent) {
        this.checkContent = checkContent;
    }
}
CheckInfoBean.java

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

package com.why.project.viewpagerwithviewdemo;

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.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;

import com.why.project.viewpagerwithviewdemo.bean.CheckInfoBean;
import com.why.project.viewpagerwithviewdemo.viewpager.MyCustomViewPager;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private Context mContext;

    private TextView mPageTv;

    /**中間viewpager區域*/
    private MyCustomViewPager mViewPager; /**ViewPager適配器*/
    private MyViewPagerAdapter mViewPageAdapter; //viewpager的數據集合
    private ArrayList<CheckInfoBean> mCheckInfoLists; /**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() {
        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() {
        //初始化數據
        mCheckInfoLists = new ArrayList<CheckInfoBean>(); for (int i=0;i<10;i++){ CheckInfoBean bean = new CheckInfoBean(); bean.setCheckResult("1"); bean.setCheckContent("這是第" + (i+1) + "頁"); mCheckInfoLists.add(bean); } //設置頁碼
        if(mCheckInfoLists.size() > 0){
            showPageNum();
        }
        //填充viewpager數據
 initViewPage();
    }

    private void initEvent() {

    }

    //設置頁碼
    private void showPageNum() {
        mPageTv.setText((currentItemIndex+1) + "/" + mCheckInfoLists.size());
    }

    /**初始化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 mCheckInfoLists.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); 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)實現viewpager內部的單選效果【爲何須要單獨實現呢,是由於這幾個單選控件只是在同一個CheckGroup中,不作處理的話,均可以選中

    /**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 mCheckInfoLists.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);

            EditText edt_content = layout.findViewById(R.id.edt_content);

            //實例化控件
            CheckBox mHegeCB = layout.findViewById(R.id.cb_hege);
            CheckBox mYanZhongCB = layout.findViewById(R.id.cb_yanzhong);
            CheckBox mZhuYaoCB = layout.findViewById(R.id.cb_zhuyao);
            CheckBox mYiBanCB = layout.findViewById(R.id.cb_yiban);

            //將四個CheckBox放到集合中,用於控制單選規則【下標值按照一、二、三、4與合格。嚴重,主要,通常的規則排列】
            final ArrayList<CheckBox> mResultRadioList = new ArrayList<CheckBox>(); mResultRadioList.add(mHegeCB); mResultRadioList.add(mYanZhongCB); mResultRadioList.add(mZhuYaoCB); mResultRadioList.add(mYiBanCB); //填充數據
            CheckInfoBean checkInfoBean = mCheckInfoLists.get(position);
            edt_content.setText(checkInfoBean.getCheckContent());

            String resultIndex = checkInfoBean.getCheckResult(); if(! TextUtils.isEmpty(resultIndex) && Integer.parseInt(resultIndex) > 0){ mResultRadioList.get(Integer.parseInt(resultIndex) - 1).setChecked(true); } //設置點擊事件
            for(int i=0;i<mResultRadioList.size();i++){ final int ckIndex = i; mResultRadioList.get(i).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { if(isChecked){ //循環mResultRadioList集合,還原其餘radio不選中狀態
                            for(CheckBox radioBtn : mResultRadioList){ if(radioBtn != mResultRadioList.get(ckIndex)){ radioBtn.setChecked(false); } } } } }); } //將佈局文件view添加到viewpager中
            container.addView((View)layout);

            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();
        }
    }

(3)實現獲取viewpager當前頁的值

一、建立viewpager內部佈局中的view集合的item的bean類this

package com.why.project.viewpagerwithviewdemo.bean;

import android.widget.CheckBox;
import android.widget.EditText;

/**
 * Created by HaiyuKing
 * Used
 */

public class ViewPagerLayoutViewsBean {
    private CheckBox mHegeCB;//【檢查結果:一、二、三、4與合格。嚴重,主要,通常。-1表明未檢查】
    private CheckBox mYanZhongCB;
    private CheckBox mZhuYaoCB;
    private CheckBox mYiBanCB;

    private EditText mContent;

    public CheckBox getmHegeCB() {
        return mHegeCB;
    }
    public void setmHegeCB(CheckBox mHegeCB) {
        this.mHegeCB = mHegeCB;
    }
    public CheckBox getmYanZhongCB() {
        return mYanZhongCB;
    }
    public void setmYanZhongCB(CheckBox mYanZhongCB) {
        this.mYanZhongCB = mYanZhongCB;
    }
    public CheckBox getmZhuYaoCB() {
        return mZhuYaoCB;
    }
    public void setmZhuYaoCB(CheckBox mZhuYaoCB) {
        this.mZhuYaoCB = mZhuYaoCB;
    }
    public CheckBox getmYiBanCB() {
        return mYiBanCB;
    }
    public void setmYiBanCB(CheckBox mYiBanCB) {
        this.mYiBanCB = mYiBanCB;
    }
    public EditText getmContent() {
        return mContent;
    }
    public void setmContent(EditText mContent) {
        this.mContent = mContent;
    }

    /**自定義獲取檢查結果數值
     * 【檢查結果:一、二、三、4與合格。嚴重,主要,通常。-1表明未檢查】*/
    public String getChangedResult(){
        String changedResult = "-1";
        if(mHegeCB.isChecked()){
            changedResult = "1";
        }else if(mYanZhongCB.isChecked()){
            changedResult = "2";
        }
        else if(mZhuYaoCB.isChecked()){
            changedResult = "3";
        }
        else if(mYiBanCB.isChecked()){
            changedResult = "4";
        }
        return changedResult;
    }
}
ViewPagerLayoutViewsBean.java

二、在activity中進行初始化、賦值、和獲取值spa

package com.why.project.viewpagerwithviewdemo;

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.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.why.project.viewpagerwithviewdemo.bean.CheckInfoBean;
import com.why.project.viewpagerwithviewdemo.bean.ViewPagerLayoutViewsBean;
import com.why.project.viewpagerwithviewdemo.viewpager.MyCustomViewPager;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private Context mContext;

    private Button mSaveBtn;
    private TextView mPageTv;

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

    private ArrayList<ViewPagerLayoutViewsBean> mViewPagerLayoutViewsBeanList;//viewpager內部的View集合

    @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() {
        mSaveBtn = findViewById(R.id.btn_save);
        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() {
        //初始化viewpager當前頁的view集合
        mViewPagerLayoutViewsBeanList = new ArrayList<ViewPagerLayoutViewsBean>(); //初始化數據
        mCheckInfoLists = new ArrayList<CheckInfoBean>();
        for (int i=0;i<10;i++){
            CheckInfoBean bean = new CheckInfoBean();
            bean.setCheckResult("1");
            bean.setCheckContent("這是第" + (i+1) + "頁");
            mCheckInfoLists.add(bean);

            mViewPagerLayoutViewsBeanList.add(null);//先添加一個空值,這樣才能夠執行set方法
        }

        //設置頁碼
        if(mCheckInfoLists.size() > 0){
            showPageNum();
        }

        //填充viewpager數據
        initViewPage();
    }

    private void initEvent() {
        mSaveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(mViewPagerLayoutViewsBeanList.get(currentItemIndex) != null) {
                    String changedContent = mViewPagerLayoutViewsBeanList.get(currentItemIndex).getmContent().getText().toString(); String changedResult = mViewPagerLayoutViewsBeanList.get(currentItemIndex).getChangedResult();
                    Toast.makeText(mContext,"檢查結果:" + changedResult + ";備註:" + changedContent,Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    //設置頁碼
    private void showPageNum() {
        mPageTv.setText((currentItemIndex+1) + "/" + mCheckInfoLists.size());
    }

    /**初始化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 mCheckInfoLists.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);

            EditText mEdtContent = layout.findViewById(R.id.edt_content);

            //實例化控件
            CheckBox mHegeCB = layout.findViewById(R.id.cb_hege);
            CheckBox mYanZhongCB = layout.findViewById(R.id.cb_yanzhong);
            CheckBox mZhuYaoCB = layout.findViewById(R.id.cb_zhuyao);
            CheckBox mYiBanCB = layout.findViewById(R.id.cb_yiban);

            //將四個CheckBox放到集合中,用於控制單選規則【下標值按照一、二、三、4與合格。嚴重,主要,通常的規則排列】
            final ArrayList<CheckBox> mResultRadioList = new ArrayList<CheckBox>();
            mResultRadioList.add(mHegeCB);
            mResultRadioList.add(mYanZhongCB);
            mResultRadioList.add(mZhuYaoCB);
            mResultRadioList.add(mYiBanCB);

            //填充數據
            CheckInfoBean checkInfoBean = mCheckInfoLists.get(position);
            mEdtContent.setText(checkInfoBean.getCheckContent());

            String resultIndex = checkInfoBean.getCheckResult();
            if(! TextUtils.isEmpty(resultIndex) && Integer.parseInt(resultIndex) > 0){
                mResultRadioList.get(Integer.parseInt(resultIndex) - 1).setChecked(true);
            }

            //設置點擊事件
            for(int i=0;i<mResultRadioList.size();i++){
                final int ckIndex = i;
                mResultRadioList.get(i).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                        if(isChecked){
                            //循環mResultRadioList集合,還原其餘radio不選中狀態
                            for(CheckBox radioBtn : mResultRadioList){
                                if(radioBtn != mResultRadioList.get(ckIndex)){
                                    radioBtn.setChecked(false);
                                }
                            }
                        }
                    }
                });
            }

            //將佈局文件view添加到viewpager中
            container.addView((View)layout);

            ViewPagerLayoutViewsBean viewBean = new ViewPagerLayoutViewsBean(); viewBean.setmContent(mEdtContent); viewBean.setmHegeCB(mHegeCB); viewBean.setmYanZhongCB(mYanZhongCB); viewBean.setmYiBanCB(mYiBanCB); viewBean.setmZhuYaoCB(mZhuYaoCB); mViewPagerLayoutViewsBeanList.set(position,viewBean);//添加到集合中,用於獲取當前頁的數據

            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();//設置頁碼
        }
    }

}

混淆配置

參考資料

暫時空缺

項目demo下載地址

https://github.com/haiyuKing/ViewPagerWithViewDemo

相關文章
相關標籤/搜索