26

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

这是我的代码:

private void ButtonClick() {
    /** get all values of the EditText-Fields */
    View v;
    ArrayList<String> mannschaftsnamen = new ArrayList<String>();
    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 仅适用于可见行,但我不知道如何以不同的方式进行操作。

4

4 回答 4

35

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

private void ButtonClick() {
    /** get all values of the EditText-Fields */
    View v;
    ArrayList<String> mannschaftsnamen = new ArrayList<String>();
    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());
    }
....
}
于 2014-04-21T15:26:45.737 回答
20

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

private void ButtonClick() {
    /** get all values of the EditText-Fields */
    View v;
    ArrayList<String> mannschaftsnamen = new ArrayList<String>();
    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());
    }
....
}
于 2013-01-13T11:53:58.910 回答
7

我认为@Arius 的答案非常接近正确的解决方案。我只想强调View你应该得到的是View包含ListView. 所以你需要getChildAt(position)与你的ListView.

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<String> mannschaftsnamen = new ArrayList<String>();
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()));
        }
    }
    ....
}
于 2014-06-16T02:19:02.520 回答
0

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

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

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

于 2014-05-19T13:17:15.517 回答