ViewPagerWithViewDemo【ViewPager和View搭配以及演示获取里面的值和CheckBox单选效果】

时间:2021-11-28 02:18:55

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

前言

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

效果图

ViewPagerWithViewDemo【ViewPager和View搭配以及演示获取里面的值和CheckBox单选效果】

使用步骤

一、项目组织结构图

ViewPagerWithViewDemo【ViewPager和View搭配以及演示获取里面的值和CheckBox单选效果】

ViewPagerWithViewDemo【ViewPager和View搭配以及演示获取里面的值和CheckBox单选效果】

注意事项:

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

ViewPagerWithViewDemo【ViewPager和View搭配以及演示获取里面的值和CheckBox单选效果】

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

ViewPagerWithViewDemo【ViewPager和View搭配以及演示获取里面的值和CheckBox单选效果】

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

ViewPagerWithViewDemo【ViewPager和View搭配以及演示获取里面的值和CheckBox单选效果】的更多相关文章

  1. jquery获取选中的值和设置单选扭选中

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  2. ViewPager和View的事件响应规则

    案例背景: 当我们实现viewpager的自动切换界面操作的时候,如果需要增加点击图片viewpager停止自动切换,松开手指viewpager自动切换又继续执行的逻辑,正常思维下实现代码如下所示: ...

  3. 20ViewPager demo1&comma;2&colon;接收ViewPager展示View的使用

    Demo1 MainActivity .JAVA package com.qf.day20_viewpager_demo1; import java.util.ArrayList; import ja ...

  4. MVC控制器获取&commat;Html&period;DropDownList值

    MVC控制器获取@Html.DropDownList值 发表于 2014 年 4 月 1 日 作者 efour — 暂无评论 先贴一段代码,演示@Html.DropDownList的使用. 前台 前台 ...

  5. MVC教程二:从控制器中获取URL的值

    一.从控制器中获取URL的值有三种方式: 1.使用Request.QueryString[] 例如: string value = Request.QueryString["BookId&q ...

  6. grails项目获取前后台的值

    grails项目中前台传值给后台: 加入我有a.gsp这个页面,a.gsp中有如下代码: 姓名:<input type="text" name="xing&quot ...

  7. android两种方式获取AsyncTask返回值

    获取AsyncTask返回值,在Activity中使用. 引用链接:https://www.oschina.net/code/snippet_725438_49858#72630 [1].[代码] [ ...

  8. 使用 JavaScript 在下拉列表中获取选定的值

    使用 JavaScript 在下拉列表中获取选定的值 演示Demo 使用 JavaScript 在下拉列表中获取选定的值? <!DOCTYPE html> <html> &lt ...

  9. robotframework,移动端(小程序)自动化,获取元素属性值的方法

    如下图,获取商品价格 属性值显示在content-desc内 传统的get text指定是无法获得到这个元素指定属性的值的 只有通过使用AppiumLibrary.get element attrib ...

随机推荐

  1. iOS 逆向之ARM汇编

    最近对iOS逆向工程很感兴趣. 目前iOS逆向的书籍有: <Hacking and Securing IOS Applications>, <iOS Hacker's Handboo ...

  2. 【leetcode】Palindrome Number &lpar;easy&rpar;

    Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could negativ ...

  3. Setting Up the ADT Bundle

    Setting Up the ADT Bundle The ADT Bundle provides everything you need to start developing apps, incl ...

  4. DM8168 debug continue&period;&period;&period; &period;&period;&period;

    1.boot   VFS: Unable to mount root fs via NFS, trying floppy.   VFS: Cannot open root device "n ...

  5. King&&num;39&semi;s Quest

    poj1904:http://poj.org/problem?id=1904 题意:国王有n个儿子,现在这n个儿子要在n个女孩里选择自己喜欢的,有的儿子可能喜欢多个,最后国王的向导给出他一个匹配,匹配 ...

  6. Solr4&period;8&period;0源码分析&lpar;13&rpar;之LuceneCore的索引修复

    Solr4.8.0源码分析(13)之LuceneCore的索引修复 题记:今天在公司研究elasticsearch,突然看到一篇博客说elasticsearch具有索引修复功能,顿感好奇,于是点进去看 ...

  7. VBS 批量修改多个文件夹下的文字命名

    Function FilesTree(sPath)      Set oFso = CreateObject("Scripting.FileSystemObject")       ...

  8. &lbrack;国嵌攻略&rsqb;&lbrack;077&rsqb;&lbrack;Linux时间编程&rsqb;

    时间类型 Coordinated Universal Time(UTC):世界标准时间,也就是格林威治时间(Greenwich Mean Time, GMT). Calendar Time:日历时间, ...

  9. 使用 ng build 构建后资源地址引用错误的问题

    最近使用 Angular 做项目的时候,通过 ng build 打包后的资源地址都带有 localhost:4200,百思不得其解,以为是打包的问题. 最后在 index.html 的文件中发现有一个 ...

  10. Vue&plus;element 实现文件导出xlsx格式

    傻瓜教程:   第一步:安装两个依赖包 npm install --save xlsx file-saver 第二步:建立一个Vue文件,导入以下代码即可 <template> <d ...