我的编程空间,编程开发者的网络收藏夹
学习永远不晚

android动态表单+dialogplus

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

android动态表单+dialogplus

android动态表单+dialogplus动态表单其他说明其他的其他

写在前面的话 鉴于之前写了一篇动态表单是很早之前使用的东西,导致会误导很多android的学习的人,并且下载demo还因为当时资源必须设置积分的原因设置了积分,所以将之前的资源免费,并且本次demo资源也不会需要积分,各位放心食用。

动态表单

其实对于android原生的来说,动态表单并不友好,我们一般都是借助 RecycleView(ListView) 来实现,然后在界面绘制的时候想办法解决这个问题,所以今天我们也会使用这种方式,然后这儿就使用了第三方BaseRecyclerViewAdapterHelper ,不多说直接开始吧。

思路: 要对列表的item做处理,我们还是需要在Adapter方面着手,由于我们的动态表单用的每一个item都会是不一样的,所以我们需要用到分组布局; 准备: 我们首先考虑的是表单对象类‘即adapter需要传入的对象类’,我们在构建表单对象的时候我们需要考虑分组布局的参数值,我们还需要item需要的标题和值,以及多选的可选值等数据,所以我们构建的对象的数据需要如下:

   public final static int SWITCH = 0;
   
   public final static int SWITCHMORE = 3;
   
   public final static int EDIT = 2;
   
   public final static int TEXT = 1;
   
   public final static int TITLE = 4;
   
   public final static int TIME = 5;
   
   private boolean mast = false;
   private int type;
   private int id;
   private String name;
   private String value;
   
   private int editExp;
   
   private List values;
其中editExp适用于输入框的类型控制,values字段适用于单选多选的时候传入的参数对象,具体如下:
private String id;// 选项ID
private String value;// 选项值
private String other;// 选项其他参数 拓展可用,这儿可以直接换为泛型哦,这样就可以把我们需要的参数也传入进来

对象类准备好了,接下来就是布局,布局代码我就不贴了,都是比较简单的布局代码:准备常用的输入框、单选多选等;

adapter 这个是一个比较重要的类,我们基本上的逻辑都需要在此类实现,此类继承自BaseMultiItemQuickAdapter ,这个父类是可以自定义多布局,是非常实用的,具体的逻辑判断对象类传入进来的需要加载的布局类型 ,此处我们截取其中一段代码来分析:
// 首先取出我们绘制的item的类型和布局
	switch (helper.getItemViewType()) {
           case FormBean.SWITCH:
               // 判断如果是单选 两项(是否)
               // 此处只是设置了是否必填,所以我加了*号
               DrawableUtils.setDrawable(mContext, helper.getView(R.id.czyw_from_item_select_title), item.isMast()? R.mipmap.icon_mast_r : R.mipmap.icon_mast_w);
               helper.setText(R.id.czyw_from_item_select_title, item.getName());
               // 拿到选择按钮
               Switch s = helper.getView(R.id.czyw_from_item_select_switch);
               // 设置按钮打开和关闭情况下对应的值
               s.setTextOn(item.getValues().get(0).getValue());
               s.setTextOff(item.getValues().get(1).getValue());
               // 判断是否有默认值,如果有则直接设置进入默认值
               if (!StringUtils.isTrimEmpty(item.getValue())) {
                   // 默认赋值
                   for (int i = 0; i  {
                       // 赋值
                       item.setValue(isChecked ? item.getValues().get(0).getId() : item.getValues().get(1).getId());
                   });
               } else {
                   // 禁止点击
                   s.setEnabled(false);
                   if (ObjectUtils.isNotEmpty(item.getValue())) {
                       for (int i = 0; i < item.getValues().size(); i++) {
                           if (item.getValue().equals(item.getValues().get(i).getId())) {
                               s.setChecked(i == 0);
                           }
                       }
                   }
               }
               break;
   }

按照上面分析的逻辑处理其他类型即可:判断类型-布局赋值-默认设置

使用 使用前需要准备数据,此处我贴出测试数据:
// 清除表单数据 可返回调用此方法重新构建
        formBeans.clear();
        // 选项值 单选
        values1 = new ArrayList();
        values1.add(new FormBean.FromValue("男(值)", "男"));
        values1.add(new FormBean.FromValue("女(值)", "女"));
        values1.add(new FormBean.FromValue("中性(值)", "中性"));
        values1.add(new FormBean.FromValue("未知(值)", "未知"));
        formBeans.add(new FormBean(FormBean.SWITCHMORE, 1, "性别", "未知(值)", values1));
        values1 = new ArrayList();
        values1.add(new FormBean.FromValue("0~20(值)", "0~20"));
        values1.add(new FormBean.FromValue("20~40(值)", "20~40"));
        values1.add(new FormBean.FromValue("40以上(值)", "40以上"));
        formBeans.add(new FormBean(FormBean.SWITCHMORE, 2, "年龄段", "0~20(值)", values1));
        // 输入框 字符串 整数 小数
        formBeans.add(new FormBean(FormBean.EDIT, 3, "情况描述", ""));
        formBeans.add(new FormBean(FormBean.EDIT, 4, "身高(cm)", "", 1));
        formBeans.add(new FormBean(FormBean.EDIT, 5, "体重(kg)", "", 2));
        values1 = new ArrayList();
        values1.add(new FormBean.FromValue("是(值)", "是"));
        values1.add(new FormBean.FromValue("否(值)", "否"));
        formBeans.add(new FormBean(FormBean.SWITCH, 6, "是否已婚", "否(值)", values1));
        values1 = new ArrayList();
        values1.add(new FormBean.FromValue("是(值)", "是"));
        values1.add(new FormBean.FromValue("否(值)", "否"));
        formBeans.add(new FormBean(FormBean.SWITCH, 7, "是否去过武汉", "否(值)", values1));
        // 多选
        values1 = new ArrayList();
        values1.add(new FormBean.FromValue("发烧(值)", "发烧"));
        values1.add(new FormBean.FromValue("咳嗽(值)", "咳嗽"));
        values1.add(new FormBean.FromValue("头晕(值)", "头晕"));
        values1.add(new FormBean.FromValue("头痛(值)", "头痛"));
        values1.add(new FormBean.FromValue("鼻塞(值)", "鼻塞"));
        values1.add(new FormBean.FromValue("全身乏力(值)", "全身乏力"));
        values1.add(new FormBean.FromValue("胸闷气短(值)", "胸闷气短"));
        values1.add(new FormBean.FromValue("呼吸困难(值)", "呼吸困难"));
        values1.add(new FormBean.FromValue("味觉失灵(值)", "味觉失灵"));
        values1.add(new FormBean.FromValue("嗅觉失灵(值)", "嗅觉失灵"));
        values1.add(new FormBean.FromValue("其他见备注(值)", "其他见备注"));
        formBeans.add(new FormBean(FormBean.TEXT, 8, "其他情况", "", values1));
        formBeans.add(new FormBean(FormBean.EDIT, 9, "备注", ""));

其中formBeans 就是adapter需要的对象,values1 就是多选单选的选项等。
然后我们只需要按照正常的adapter和recycleview来处理即可:

// 动态表单
rv.setLayoutManager(new LinearLayoutManager(this));
formAdapter = new FormAdapter(formBeans, true);
formAdapter.bindToRecyclerView(rv);

数据处理:我们只需要获取到adapter中的数据,对数据做遍历即可取出我们想要的数据:

// 获取数据
                        for (FormBean formBean : formAdapter.getData()) {
                            switch (formBean.getId()) {
                                case 4:
                                    // ID为4的数据 此处单独判断ID可用来判断是否是必传字段|电话号码验证 等逻辑操作
                                    // 例身高为必填 身高的ID我们设置了是4 就判断此处的Value是否为空,为空则提示 此为必填等
                                    // 也可将对应的字段填充到对象中
                                    break;
                            }
                            data.append(formBean.getName()).append("--->").append(formBean.getValue()).append("\n");
                        }
监听 监听其实也比较好处理,我们监听在adapter中处理即可,并且处理值等:
				// 获取到view添加监听
				view.setOnClickListener(v -> {
                       List beans = new ArrayList();
                       for (FormBean.FromValue value : item.getValues()) {
                           beans.add(new GridSelectBean(value.getValue(), value.getId()));
                       }
                       // 此处使用了dialogplus来处理选择布局
                       new ConfirmListDialog(mContext)
                               .setTitleStr("请选择")
                               .setList(beans)
                               .setConfirmListDialogListener(new ConfirmListDialogListener() {
                                   @Override
                                   public void onCheckSelect(List mList) {
                                   }
                                   @Override
                                   public void onCheckSingle(GridSelectBean bean, int position) {
                                   }
                                   @Override
                                   public void onItemClickListener(GridSelectBean bean, int position) {
                                       // 赋值
                                       item.setValue(bean.getValue());
                                       view.setText(bean.getTitle());
                                   }
                               })
                               .show();
                   });
其他说明

至此动态的加载表单算是结束了,布局可能有点丑陋,但是按照这个逻辑可以自己修改布局,所以问题不大。
最终效果图如下:
在这里插入图片描述

其他的其他

代码地址

本项目除了android动态表单,通过adapter来实现,还包含了dialogplus的再次封装,让使用更便捷,还包含有控件实现可拖拽的监听事件。

最后结语:前人栽树后人乘凉,我只是那个在你们乘凉的时候递给你们板凳和瓜子的人,让你们在乘凉的时候能够更舒适和方便一些,所以最终还是要感谢各位大佬们的开源的库和项目能得以引用和借鉴

推荐本次使用的第三方的库:

1. BaseRecyclerViewAdapterHelper
2. dialogplus
3. AndroidUtilCode
4. baseAdapter


作者:liu_yifang


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

android动态表单+dialogplus

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

android动态表单+dialogplus

android动态表单+dialogplus动态表单其他说明其他的其他 写在前面的话 鉴于之前写了一篇动态表单是很早之前使用的东西,导致会误导很多android的学习的人,并且下载demo还因为当时资源必须设置积分的原因设置了积分,所以将之
2022-06-06

Android AOP切面编程+动态权限申请

AOP+动态权限申请 最近在利用AspectJ做埋点,突发奇想,能否也用类似方法做动态权限申请?发现可以。我来介绍一下我的思路。 AOP是什么 AOP,百度一下就知道,是 Aspect Oriented Programming,面向切面编程
2022-06-06

javascript怎么做到动态表单

本篇内容介绍了“javascript怎么做到动态表单”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、表单元素的动态添加通常情况下,网站上的
2023-07-06

javascript如何做到动态表单

随着互联网应用的不断发展,用户对于网站的交互体验要求越来越高。动态表单就是其中一个提高用户交互体验的重要方式。而 JavaScript 作为前端开发的一个必备技能,也能够很好地实现动态表单效果。本文将介绍 JavaScript 如何做到动态表单,从表单元素的动态添加、删除以及条件渲染等方面进行讲解。一、表单元素的动态添加通常情况下,网站上的表单是用 HTML 代码完成的,但是用
2023-05-14

angular怎么动态生成表单

在Angular中,可以使用动态表单生成器来动态生成表单。可以使用Angular的Reactive Forms或Template-driven Forms来实现动态生成表单。使用Reactive Forms生成动态表单:1. 首先,在组件中
2023-10-12

Android之AnimationDrawable简单模拟动态图

Drawable animation可以加载Drawable资源实现帧动画。AnimationDrawable是实现Drawable animations的基本类。 这里用AnimationDrawable 简单模拟动态图的实现。fragm
2022-06-06

vue怎么创建动态form表单

这篇文章主要讲解了“vue怎么创建动态form表单”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue怎么创建动态form表单”吧!针对各个表单写好通用的组件,然后根据type用v-if来渲
2023-07-04

Android动态添加menu菜单的简单方法

从menu按键开始,涉及以下3个方法: 1、onCreateOptionsMenu(Menu menu)2、onPrepareOptionsMenu(Menu menu)3、onOptionsItemSelected(MenuItem it
2022-06-06

Android 动态菜单实现实例代码

Android 动态菜单 先上效果图比较简单,主要就是属性动画的使用和坐标角度的小细节。 实现 实现效果: 图标按照路径一路缩放渐变过来即可。 核心代码/*** Item开启动画** @param btnItem* @param inde
2022-06-06

vue动态表单数据如何提交

Vue动态表单数据可以通过以下步骤来提交:1. 在Vue组件中定义表单数据,可以使用data属性来存储表单数据。2. 使用v-model指令将表单控件与Vue实例中的数据进行绑定。3. 在表单的submit事件中,使用Vue实例中的数据来构
2023-05-29

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录