当前位置: 首页 > news >正文

Android动态可编辑长度列表

概述

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

详细

运行效果:

二、实现思路:

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;@Overrideprotected 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);}// 删除栏目@Overridepublic void delateObserve(int pos) {dynamicNewAdapter.syncSetNewData(new ArrayList<>(getAdapterDetails(pos)));}@Overridepublic 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;}@Overrideprotected 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() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {helper.binding.tvUsageUnit.setText(numbers[position]);}@Overridepublic 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() {@Overridepublic 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.lryc.cn/news/147072.html

相关文章:

  • 合并对象在 Typescript 中的实现与应用
  • antd upload组件beforeUpload返回promise之后,获取的文件不是file类型导致上传失败
  • 创建ffmpeg vs2019工程
  • 无涯教程-机器学习 - Jupyter Notebook函数
  • ubuntu安装单机的Consul
  • 聊聊mybatis-plus的sql加载顺序
  • 基于jeecg-boot的flowable流程审批时增加下一个审批人设置
  • HTML 与 CSS 有什么区别?
  • 服务器数据恢复-vmware ESXI虚拟机数据恢复案例
  • Rabbitmq的Shovel
  • 华为手机实用功能介绍
  • 算法题打卡day50-动态规划 | 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV
  • jvm与锁
  • 零基础安装pycuda
  • Streamlit 讲解专栏(十一):数据可视化-图表绘制详解(中)
  • d3dx9_35.dll丢失怎么解决
  • Ansible自动化运维工具(二)
  • uniapp中使用原生canvas标签绘制视频帧来模拟拍照,拍照后将图绘制在另外一个canvas上编辑画图,这样反复操作
  • 机器视觉工程师们,学习是工作以外的事情
  • 数据驱动的生活:探索未来七天生活指数API的应用
  • 【数据分享】2006-2021年我国城市级别的集中供热相关指标(免费获取\20多项指标)
  • 2022年研究生数学建模竞赛优秀论文汇总
  • 阿里云申请免费SSL证书的两种验证方式及配置服务器Tomcat升级HTTPS协议
  • SQL Server 和 MySql 语法和关键字的区别
  • 2023_Spark_实验三:基于IDEA开发Scala例子
  • 2023年高教社杯数学建模思路 - 案例:异常检测
  • C# Dapper 操作Oracle数据库
  • element侧边栏子路由点击不高亮问题
  • C# 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)
  • Linux 进程的睡眠和唤醒详解