【发布时间】:2014-03-18 21:20:50
【问题描述】:
我使用 EditTexts 和 Spinners 的 ListView 创建了一个表单。
这是因为我必须提供一个“添加新项目”按钮,该按钮将插入更多的 EditText、Spinner 和 TextViews 副本。认为在 ListView 中很容易做到。
考虑ListViews回收Views,如何遍历所有的表单元素?
【问题讨论】:
我使用 EditTexts 和 Spinners 的 ListView 创建了一个表单。
这是因为我必须提供一个“添加新项目”按钮,该按钮将插入更多的 EditText、Spinner 和 TextViews 副本。认为在 ListView 中很容易做到。
考虑ListViews回收Views,如何遍历所有的表单元素?
【问题讨论】:
我可以给你一个想法,
最初在填充列表视图时,您将使用一些 hashmap 的 arraylist 或一些 pojo,而如果您最初只有一行,则只需向该数组列表添加一项并填充列表视图。
1.对于添加行按钮,提供如下功能,向该数组列表添加一项并通知适配器。
2.要保存编辑文本数据,在编辑文本的文本更改时,或者如果你有按钮从编辑文本中获取文本,提供如下功能,从你得到的那个位置的 arraylist 获取项目在 getView() 方法中。并使用您当前的数据编辑该项目。
如果您需要更多澄清,请在您有任何疑问的情况下发表评论。
【讨论】:
由于视图回收,任何时候都只有少数适配器视图存在。大约刚好能填满屏幕。因此,它们在任何给定时间只保存您的一部分数据——对它们进行迭代是行不通的。
唯一的选择是遍历提供视图/适配器数据的对象(例如列表、地图、光标等)。如果这些视图在呈现给用户后被更改(例如存储输入),那么这个输入也必须被缓存;这应该已经设置好了,否则视图回收会导致此输入丢失。
【讨论】:
您的问题将通过以下代码解决: ArrayListarrStr = null;
对于特定的位置,这将起作用:
View view=listView.getChildAt(position);
EditText editText=view.findViewById(R.id.editText);
String string=editText.getText().toString();
但是当您想获得多个职位时,这将起作用:
arrStr = new ArrayList<String>();
for(int i=0;i<items.size();i++){
View view = listView.getChildAt(i);
EditText editText = view.findViewById(R.id.editText);
String str = editText.getText().toString();
arrStr .add(str);
}
你会从 ArrayList 中的 listView 中获取所有值。
【讨论】:
我最终在 ScrollView 中使用了 ListView。我不希望它回收视图,因为,你需要从每个项目中获取所有数据,而且,它是一个用户表单。通常列表视图将包含 3-4 个项目。我不认为用户会创建这么多项目来导致任何性能问题。
由于高度为 wrap_contents 的 ListView,在 ScrollView 内会导致它仅显示顶部项目,我不得不在这里使用这个技巧 https://stackoverflow.com/a/19311197/1067596
【讨论】:
尝试创建一个 id,循环创建新项目的次数...例如。命名您的 et_number_1,et_number_2,et_number_3...您可以轻松生成具有
"et_number_"+i
所以同样,您也可以通过这种方式访问相应的 edittext 值来创建您创建的次数。 让我知道它是否有帮助。如果您需要更多说明。
【讨论】: