迭代ListView并获取EditText-Field值

我创建了一个ListView(myList),每行有一个EditText-Field(R.id.mannschaften)。 在ListView下,我创建了一个Button,并在OnCreate() – Method中为它设置了一个OnClickListener。 现在,当单击Button时,我想遍历ListView并在每一行中获取EditText-Field的值并将它们保存在String-List中。 但是我该怎么做?

这是我的代码:

private void ButtonClick() { /** get all values of the EditText-Fields */ View v; ArrayList mannschaftsnamen = new ArrayList(); EditText et; for (int i = 0; i < myList.getCount(); i++) { v = myList.getChildAt(i); et = (EditText) v.findViewById(R.id.mannschaften); mannschaftsnamen.add(et.getText().toString()); } ..... } 

我已经知道,getChildAt仅适用于可见行,但我不知道如何以不同方式执行。

Solutions Collecting From Web of "迭代ListView并获取EditText-Field值"

当您使用myList.getAdapter().getView(i,null,null)您将获得项视图的新实例,尝试ListView.getChildAt(position)方法,如下所示:

 private void ButtonClick() { /** get all values of the EditText-Fields */ View v; ArrayList mannschaftsnamen = new ArrayList(); EditText et; for (int i = 0; i < myList.getCount(); i++) { v = myList.getChildAt(i); et = (EditText) v.findViewById(R.id.editText1); mannschaftsnamen.add(et.getText().toString()); } .... } 

在朋友的帮助下解决问题:

 private void ButtonClick() { /** get all values of the EditText-Fields */ View v; ArrayList mannschaftsnamen = new ArrayList(); EditText et; for (int i = 0; i < myList.getCount(); i++) { v = myList.getAdapter().getView(i, null, null); et = (EditText) v.findViewById(i); mannschaftsnamen.add(et.getText().toString()); } .... } 

我认为@Arius的答案非常接近正确的解决方案。 我只想强调一下你应该得到的View是包含ListView View 。 因此,您需要与ListView相关的getChildAt(position)

 private void ButtonClick() { /** get all values of the EditText-Fields find your ListView local variable you had created for example : private ListView listview; You also need to catch null value of EditText first. */ ArrayList mannschaftsnamen = new ArrayList(); EditText et; for (int i = 0; i < listview.getCount(); i++) { et = (EditText) listview.getChildAt(i).findViewById(R.id.editText1); if (et!=null) { mannschaftsnamen.add(String.valueOf(et.getText())); /** you can try to log your values EditText */ log.v("ypgs", String.valueOf(et.getText())); } } .... } 

关于为什么所选答案有时会在“et =(EditText)v.findViewById(i);”上抛出null。

难道不是在那个时候尝试在您之前选择的视图中选择位置i的项目吗? 因此,如果子视图中的项目少于整个列表中的项目,则由于我尝试选择不存在的项目,您将获得null。

也许嵌套循环可以解决这个问题? 或者,如果您已经知道所需元素的索引,只需直接给它索引即可。