最近遇到这么一个需求——在一个页面中,点击“新增一行”按钮,动态添加一行输入行。提交的时候,收集所有Edittext中的数据,然后提交。
如图
非常简单的一个需求,实现起来却遇到了不少问题。
拿到这个需求后,第一反应有两种方案:
一、使用ListView(RecyclerView),每个item中引用多个Edittext来实现(顺便多说一句,话筒按钮是语音录入监听,“肌肉注射”按钮是个下拉框,用spinner实现)。
二、放一个LinearLayout,通过addView()动态添加一行输入栏;
输入栏中涉及多个监听,语音录入,Spinner的显示。以及最坑的,Edittext的模糊查询(通过录入的数据为参数,获取一个列表,以下拉框的形式显示出来)。
如果使用addView()的方式做,感觉有点复杂,优先使用ListView来展示。但是一步一步的实现过程中,遇到了很多问题。比如,在adapter中给edittext添加textwatcher,总是会出现执行多次的问题;又比如,新增一行之后刷新listview,会造成其他ITEM中录入过的edittext数据清空……
如果你也遇到类似问题,并为此苦恼,sorry,我尝试了各种方式,到最后也没想到解决的方法。
不过找到了另一种方式来实现这个需求——使用fragment。
主页面出放一个LinearLayout作为容器,将输入栏单独写成一个fragment,将fragment存放到一个集合中,新增则new一个新的fragment存放进去。需要获取所有输入的数据时,遍历集合调用fragment中取数据的公开方法即可。