我使用EditTexts和Spinners的ListView创建了一个表单。
这是因为我必须提供一个“添加新项目”按钮,该按钮会插入更多的EditText,Spinner和TextViews副本。认为在ListView中很容易做到。
考虑ListViews回收视图,如何迭代所有表单元素?
答案 0 :(得分:0)
我可以给你一个想法,
最初在填充列表视图时,你会使用一些hashmap或某些pojo的arraylist,而如果你最初有一行你只需要将一个项添加到该数组列表并填充列表视图。
1.对于Add row按钮,给该arraylist提供类似的功能,再添加一个项目并通知适配器。
2.要保存编辑文本数据,在编辑文本的文本更改上,或者如果您在那里有按钮以从编辑文本中获取文本,请提供类似的功能,从该位置的arraylist获取项目在getView()方法中。并使用当前数据编辑该项目。
如果你需要更多的澄清,请说明你是否有任何疑问。
答案 1 :(得分:0)
由于视图回收,任何时候都只有少数适配器视图存在。大致足以填满屏幕。因此,它们在任何给定时间只保留一部分数据 - 迭代它们将无法工作。
唯一的选择是迭代提供视图/适配器数据的对象(例如列表,地图,光标等)。如果这些视图在呈现给用户之后被改变(例如存储输入),则该输入也必须被高速缓存;这应该已经设置,因为视图回收会导致此输入丢失。
答案 2 :(得分:0)
您的问题将通过以下代码解决: 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&lt;&gt;中获取listView中的所有值。
答案 3 :(得分:0)
我终于在ScrollView中使用了ListView。我不希望它回收视图,因为,你需要从每个项目中获取所有数据,以及它的用户表单。通常列表视图将包含3-4项。我不认为用户会创建这么多项来导致任何性能问题。
由于带有高度wrap_contents的ListView,在ScrollView中将导致它只显示顶部项目,我不得不在这里使用此hack https://stackoverflow.com/a/19311197/1067596
答案 4 :(得分:-1)
尝试使用循环创建一个id来创建新项目的次数......例如。将您的et_number_1,et_number_2,et_number_3命名为您可以轻松生成的
"et_number_"+i
所以再次这样你也可以访问你创建的次数的相应edittext值。 Lemme知道它是否有帮助。如果您需要进一步澄清。