zoukankan      html  css  js  c++  java
  • ViewPagerWithViewDemo【ViewPager和View搭配以及演示获取里面的值和CheckBox单选效果】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处!

    前言

    简单记录下ViewPager和自定义布局view的搭配使用以及布局文件中单选效果、获取viewpager布局内部值的功能。

    效果图

    使用步骤

    一、项目组织结构图

    注意事项:

    1、  导入类文件后需要change包名以及重新import R文件路径

    2、  Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

    二、导入步骤

    (1)将ViewPager和内部布局文件以及数据集合关联起来

    1、将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放到集合中,用于控制单选规则【下标值按照1、2、3、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

    2、在activity布局文件中引用MyCustomViewPager【注意,MyCustomViewPager的完整路径需要根据实际情况修改

    <?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>

    3、编写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

    4、添加集合item的bean类CheckInfoBean

    package com.why.project.viewpagerwithviewdemo.bean;
    
    /**
     * Created by HaiyuKing
     * Used 检查结果bean类
     */
    
    public class CheckInfoBean {
        /**检查结果【检查结果:1、2、3、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

    5、在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放到集合中,用于控制单选规则【下标值按照1、2、3、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当前页的值

    1、创建viewpager内部布局中的view集合的item的bean类

    package com.why.project.viewpagerwithviewdemo.bean;
    
    import android.widget.CheckBox;
    import android.widget.EditText;
    
    /**
     * Created by HaiyuKing
     * Used
     */
    
    public class ViewPagerLayoutViewsBean {
        private CheckBox mHegeCB;//【检查结果:1、2、3、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;
        }
    
        /**自定义获取检查结果数值
         * 【检查结果:1、2、3、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

    2、在activity中进行初始化、赋值、和获取值

    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放到集合中,用于控制单选规则【下标值按照1、2、3、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

  • 相关阅读:
    Two Sum II
    Subarray Sum
    Intersection of Two Arrays
    Reorder List
    Convert Sorted List to Binary Search Tree
    Remove Duplicates from Sorted List II
    Partition List
    Linked List Cycle II
    Sort List
    struts2结果跳转和参数获取
  • 原文地址:https://www.cnblogs.com/whycxb/p/9428712.html
Copyright © 2011-2022 走看看