Android动态可编辑长度列表

news2024/11/27 9:35:30

概述

在界面实现一个列表,用户可以随意给列表新增或者删除项目,在开发中比较常用,但是真正做起来又有点花时间,今天花时间做一个,以便在以后的开发中用到。

详细

运行效果:

二、实现思路:

1、实现一个主界面,主界面放一个list用来显示这个动态的列表,还要包含一个按钮用来点击时新增列表的栏目。
2、实现列表的适配器Adapter,这里实现显示栏目布局以及删除当前栏目的接口回调。
3、在主界面列表变更中(新增or删除),能准确获取当前适配器的内容,以便不会误删。

三、实现过程:

1、实现一个主界面,主界面放一个list用来显示这个动态的列表,还要包含一个按钮用来点击时新增列表的栏目。

 

    public class MainActivity extends AppCompatActivity implements ObserveEtListener, View.OnClickListener{
        private ActivityMainBinding mViews;
        private DynamicNewAdapter dynamicNewAdapter;
        private MainViewModel mainViewModel;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mViews = DataBindingUtil.setContentView(this,R.layout.activity_main);
            mainViewModel = new ViewModelProvider(this).get(MainViewModel.class);
            dynamicNewAdapter = new DynamicNewAdapter(this);
            mViews.recycleView.setAdapter(dynamicNewAdapter);
            dynamicNewAdapter.syncSetNewData(mainViewModel.drugsBeanList);
            mViews.setOnClickListener(this);
        }
       // 删除栏目
        @Override
        public void delateObserve(int pos) {
            dynamicNewAdapter.syncSetNewData(new ArrayList<>(getAdapterDetails(pos)));
        }
        @Override
        public void onClick(View v) {
            int vId = v.getId();
            switch (vId){
                case R.id.addItem:
                    // 新增栏目
                    addItem();
                    break;
            }
        }
        /**
         * 新增栏目
         */
        private void addItem(){
            mainViewModel.drugsBeanList = getAdapterDetails(-1);
            mainViewModel.drugsBeanList.add(new DrugsBean("", "", "ml/亩"));
            dynamicNewAdapter.syncSetNewData(mainViewModel.drugsBeanList);
        }
2、实现列表的适配器Adapter,这里实现显示栏目布局以及删除当前栏目的接口回调。
    public class DynamicNewAdapter extends BaseDataBindingAdapter<DrugsBean, ItemDyncmicAdapterBinding> {
        private ObserveEtListener listener;
        private String[] numbers = Utils.getApp().getResources().getStringArray(R.array.usage_array);
        public DynamicNewAdapter(ObserveEtListener listener) {
            super(R.layout.item_dyncmic_adapter);
            this.listener = listener;
        }
        @Override
        protected void convert(@NonNull DataBindViewHolder<ItemDyncmicAdapterBinding> helper, DrugsBean drugsBean) {
            helper.binding.tvNameValue.setText(drugsBean.drugName);
            helper.binding.tvUsageValue.setText(drugsBean.weigth);
            int pos = getData().indexOf(drugsBean);
            helper.binding.tvUsageUnit.setText(drugsBean.unit);
            helper.binding.spinnerUnit.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    helper.binding.tvUsageUnit.setText(numbers[position]);
                }
                @Override
                public void onNothingSelected(AdapterView<?> parent) {
                }
            });
            if (drugsBean.unit != null && drugsBean.unit.indexOf("ml") > -1) {
                helper.binding.spinnerUnit.setSelection(0, true);
            } else {
                helper.binding.spinnerUnit.setSelection(1, true);
            }
            helper.setTag(R.id.img_del, pos);
            helper.binding.imgDel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null) {
                        int pos = (int) v.getTag();
                        notifyItemRemoved(pos);
                        getData().remove(pos);
                        listener.delateObserve(pos);
                    }
                }
            });
        }
    }
3、在主界面列表变更中(新增or删除),能准确获取当前适配器的内容,以便不会误删。
/**
     * 获取当前列表数据
     * @param pos
     * @return
     */
    private List<DrugsBean> getAdapterDetails(int pos) {
        List<DrugsBean> details = new ArrayList<>();
        int length = mViews.recycleView.getChildCount();
        for (int i = 0; i < length; i++) {
            if (pos == i)
                continue;
            ConstraintLayout ll_item = (ConstraintLayout) mViews.recycleView.getChildAt(i);
            TextView tv_name_value = ll_item.findViewById(R.id.tv_name_value);
            TextView tv_usage_value = ll_item.findViewById(R.id.tv_usage_value);
            TextView tv_usage_unit = ll_item.findViewById(R.id.tv_usage_unit);
            details.add(new DrugsBean(tv_name_value.getText().toString().trim(),
                    tv_usage_value.getText().toString().trim(), tv_usage_unit.getText().toString().trim()));
        }
        return details;
    }

四、项目文件结构截图

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/952580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode316. 去除重复字母(单调栈 - java)

去除重复字母 题目描述单调栈代码演示进阶优化 上期经典 题目描述 难度 - 中等 leetcode316. 去除重复字母 给你一个字符串 s &#xff0c;请你去除字符串中重复的字母&#xff0c;使得每个字母只出现一次。需保证 返回结果的字典序最小&#xff08;要求不能打乱其他字符的相对…

TCP/UDP原理

文章目录 一、端口1. 端口的定义和作用2.服务端和客户端的区别3.常见的知名端口号有 二、TCP的原理1.TCP头部封装格式2.TCP可靠性机制三次握手确认机制四次挥手RST结束连接窗口机制 3.完整性校验4.TCP特征5.TCP的适用场景 三、UDP的原理1.UDP头部封装格式2.UDP特征3.UDP的适用场…

单元测试及其工具Junit

1.单元测试是什么 单元测试是开发者编写的一小段代码&#xff0c;用于检验被测代码的一个很小的、很明确的功能是否正确&#xff0c;通常而言&#xff0c;一个单元测试是用于判断某个特定条件&#xff08;或者场景&#xff09;下某个特定函数的行为。 单元测试是软件测试的一种…

MongoDB实验——MongoDB配置用户的访问控制

MongoDB 配置用户的访问控制 一、 实验原理 理解admin数据库&#xff1a;安装MongoDB时&#xff0c;会自动创建admin数据库&#xff0c;这是一个特殊数据库&#xff0c;提供了普通数据库没有的功能&#xff0c;例如&#xff0c;有些账户角色赋予用户操作多个数据库的权限&…

Elasticsearch:利用矢量搜索进行音乐信息检索

作者&#xff1a;Alex Salgado 欢迎来到音乐信息检索的未来&#xff0c;机器学习、矢量数据库和音频数据分析融合在一起&#xff0c;带来令人兴奋的新可能性&#xff01; 如果你对音乐数据分析领域感兴趣&#xff0c;或者只是热衷于技术如何彻底改变音乐行业&#xff0c;那么本…

spring多个aop切面之间的顺序

概述 业务中通常会定义多个注解来进行切面&#xff0c;那么当一个方法有多个注解的时候&#xff0c;此时这些切面是以什么顺序来执行的呢。 spring的aop切面有点像鸡蛋的层次 最外面的切面包裹着里面的切面 捞个网图 排序实现 既然是属于spring的&#xff0c;那用的肯定是…

pear admin 切换mysql梳理

pear admin 切换mysql&梳理 一、切换mysql操作步骤详解1.1 config.py内容修改1.2 注意事项 二、二开梳理2.1 需求2.2 用户管理部分梳理 一、切换mysql操作步骤详解 1.1 config.py内容修改 import logging import os# 主题面板的链接列表配置 SYSTEM_NAME "Pear Adm…

Web后端开发(请求响应)上

请求响应的概述 浏览器&#xff08;请求&#xff09;<--------------------------(HTTP协议)---------------------->&#xff08;响应&#xff09;Web服务器 请求&#xff1a;获取请求数据 响应&#xff1a;设置响应数据 BS架构&#xff1a;浏览器/服务器架构模式。…

IDEA配置MAVEN本地仓库

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【C++】关于using namepace xxx 使用命名空间和冲突

官方定义 namespace是指 标识符的各种可见范围。命名空间用关键字namespace来定义。 命名空间是C的一种机制&#xff0c;用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此组群的名字。 基本使用 编译及执行命令&#xff1a; g test.cpp -o test ./…

SpringBoot Mybatis 多数据源 MySQL+Oracle+Redis

一、背景 在SpringBoot Mybatis 项目中&#xff0c;需要连接 多个数据源&#xff0c;连接多个数据库&#xff0c;需要连接一个MySQL数据库和一个Oracle数据库和一个Redis 二、依赖 pom.xml <dependencies><dependency><groupId>org.springframework.boot&l…

【广州华锐互动】VR党建多媒体互动展厅:随时随地开展党史教育

随着科技的不断发展&#xff0c;虚拟现实(VR)技术已经逐渐渗透到各个领域&#xff0c;其中党建教育尤为受益。为了更好地传承红色基因&#xff0c;弘扬党的优良传统&#xff0c;广州华锐互动推出了VR党建多媒体互动展厅&#xff0c;让广大党员干部和人民群众通过现代科技手段&a…

CountDownLatch、Semaphore详解——深入探究CountDownLatch、Semaphore源码

这篇文章将会详细介绍基于AQS实现的两个并发类CountDownLatch和Semaphore&#xff0c;通过深入底层源代码讲解其具体实现。 目录 CountDownLatch countDown() await() Semaphore Semaphore类图 Semaphore的应用场景 acquire() tryAcquire() CountDownLatch /*** A synchroni…

Arduino程序设计(六)蜂鸣器实验

蜂鸣器实验 前言一、蜂鸣器简介1、蜂鸣器的工作原理2、有源蜂鸣器和无源蜂鸣器的区别3、蜂鸣器模块电路原理图 二、有源蜂鸣器实验有源蜂鸣器控制 三、无源蜂鸣器实验1、调节蜂鸣器输出频率2、无源蜂鸣器触发报警声3、无源蜂鸣器播放音乐 参考资料 前言 本文主要介绍两种蜂鸣器…

基于jeecg-boot的flowable流程审批时增加下一个审批人设置

更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 因为有时…

工服穿戴检测算法 工装穿戴识别算法

工服穿戴检测算法 工装穿戴识别算法利用yolo网络模型图像识别技术&#xff0c;工服穿戴检测算法 工装穿戴识别算法可以准确地识别现场人员是否穿戴了正确的工装&#xff0c;包括工作服、安全帽等。一旦检测到未穿戴的情况&#xff0c;将立即发出警报并提示相关人员进行整改。Yo…

python中的模块和包

模块 模块就是一个Python文件&#xff0c;里面有类、函数、变量等&#xff0c;我们可以拿过来用&#xff08;导入模块去使用&#xff09; 模块的导入方式 模块在使用前需要先导入。导入的语法如下: 常用的组合形式如&#xff1a; import 模块名from 模块名 import 类、变量、…

JavaScript闭包漏洞与修补措施

请先看下面一段代码 var obj (function () {var sonObj {a: 1,b: 2}return {getObj: function (v) {return sonObj[v]}}})()可以看出,这是一段很典型的js闭包代码,可以通过obj调用get方法传一个参数,如果传的是a就可以得到闭包内的对象sonObj.a var obj (function () {var s…

企业合规改革如何进行?

企业合规是现代商业运作中的重要议题&#xff0c;合规改革是促使企业适应法规变化、规范经营行为的必经之路。本文将介绍企业合规改革的步骤和方法&#xff0c;帮助企业建立健全的合规机制&#xff0c;增强竞争力&#xff0c;并赢得社会信任。 一、评估和分析 合规改革的第一…

明厨亮灶监控实施方案 opencv

明厨亮灶监控实施方案通过pythonopencv网络模型图像识别算法&#xff0c;一旦发现现场人员没有正确佩戴厨师帽或厨师服&#xff0c;及时发现明火离岗、不戴口罩、厨房抽烟、老鼠出没以及陌生人进入后厨等问题生成告警信息并进行提示。OpenCV是一个基于Apache2.0许可&#xff08…