如何从具有多个视图的 ListView 中的 EditText 获取文本?

Posted

技术标签:

【中文标题】如何从具有多个视图的 ListView 中的 EditText 获取文本?【英文标题】:How to get text from EditText within ListView with multiple Views? 【发布时间】:2015-09-19 09:23:12 【问题描述】:

我有一个 ListView,每行包含两个 TextView 和一个 EditText。我已经搜索和搜索,无法弄清楚如何获取用户输入到 EditText 中的文本。我最近的尝试实现了 TextWatcher。

public void addIngredientToMeal(String ingredientName) 

    ingredient_list = (ListView) findViewById(R.id.ingredients_in_meal_listView);

    int numberOfIngredients = ingredient_list.getChildCount();

    ListAdapter adapter = new ListAdapter();
    adapter.name_array = new String[numberOfIngredients+1];

    for (int i = 0; i < numberOfIngredients; i++)
        adapter.name_array[i] = (String) ingredient_list.getItemAtPosition(i);

    adapter.name_array[numberOfIngredients] = ingredientName;
    ingredient_list.setItemsCanFocus(true);
    ingredient_list.setAdapter(adapter);


private class ListAdapter extends BaseAdapter

    public String[] name_array, qty_array;

    @Override
    public int getCount() 
        // TODO Auto-generated method stub
        if(name_array != null && name_array.length != 0)
            return name_array.length;    
        
        return 0;
    

    @Override
    public Object getItem(int position) 
        // TODO Auto-generated method stub
        return name_array[position];
    

    @Override
    public long getItemId(int position) 
        // TODO Auto-generated method stub
        return position;
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
            //ViewHolder holder = null;

            final ViewHolder holder;
                if (convertView == null) 

                    holder = new ViewHolder();
                    LayoutInflater inflater = NewMeal.this.getLayoutInflater();
                    convertView = inflater.inflate(R.layout.ingredients_in_meal_layout, null);
                    holder.textView1 = (TextView) convertView.findViewById(R.id.ingredient_name_in_new_meal_textView);
                    holder.editText1 = (EditText) convertView.findViewById(R.id.ingredient_qty_in_new_meal_editText);
                    holder.textView2 = (TextView) convertView.findViewById(R.id.ingredient_unit_in_new_meal_textView);

                    convertView.setTag(holder);

                 else 

                    holder = (ViewHolder) convertView.getTag();
                

                holder.ref = position;
                holder.textView1.setText(name_array[position]);
                holder.textView2.setText(databaseAdapter.dbQuery(name_array[position]));
                holder.editText1.setText(qty_array[position]);
                holder.editText1.addTextChangedListener(new TextWatcher() 

                        @Override
                        public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) 
                            // TODO Auto-generated method stub
                            

                        @Override
                        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                    int arg3) 
                                // TODO Auto-generated method stub

                        

                        @Override
                        public void afterTextChanged(Editable arg0) 
                                qty_array[holder.ref] = arg0.toString();

                        
                );
            return convertView;
    

    private class ViewHolder 
        TextView textView1, textView2;
        EditText editText1;
        int ref;
    




【问题讨论】:

【参考方案1】:

对于那些可能有类似问题的人,我解决了我遇到的问题。

问题: 需要获取在 listView 中包含的多个 editTexts 中输入的值。使用 listviewname.getItemAtPosition(integer) 只能获取第一个 editText 的值。而且我的listview每一行都包含多个view,所以getItemAtPosition只返回listView第一行第一个view的值。

解决办法:

定义一个listView对象来标识我们关心的listview 关于 定义一个可以获取listview的View对象 定义您尝试从列表视图中获取的任何字段(EditTexts、TextViews 等) 获取列表视图当前包含的行数 使用 listviewname.getChildAt(position) 设置视图对象 使用 (EditText) viewObject.findViewById(R.id.edittextid) 之类的方式分配字段(例如,editText) 使用editTextObject.getText().toString()从字段中获取值

这里有一些可以在按下按钮时实现的示例代码:

ListView lvName = (ListView) findViewById(R.id.listview1);
View v;
EditText et;

int listLength = lv.getChildCount();
String[] valueOfEditText = new String(listLength);
for (int i = 0; i < listLength; i++)

    v = lvName.getChildAt(i);
    et = (EditText) v.findViewById(R.id.edittext1);
    valueOfEditText[i] = et.getText().toString();

【讨论】:

太棒了!谢谢【参考方案2】:

getFocusedChild(position) 会返回一个View,或者findFocus()

View row = ingredient_list.getFocusedChild();
EditText et =  (EditText)row.findViewById(R.id.ingredient_qty_in_new_meal_editText);

编辑

对不起,我误解了创建一个 gist 将与输入一起祝酒

https://gist.github.com/imjarp/9313c687ccbe339d052f

【讨论】:

感谢您的回复。您的代码看起来不错,但我有两个问题。 1. 我可以从 IngredientAdapter 之外的函数中获取文本吗? 2. someArray[] 有一个预定义的大小,但我的将取决于用户输入的条目数。有没有办法处理这些? 很抱歉回复晚了,关于您的担忧 1. 是的,如果您定义一个单独的 Listener 类并分配它,您可以,2 您可以将项目添加到您的适配器,然后调用 adapter.notifydatasetchanged() ,但老实说,我会使用一些 DialogFragment 将成分添加到您的列表中,而不是使用和编辑文本:) 希望它对您有所帮助 感谢您迄今为止的帮助。让我对我正在尝试做的事情不那么含糊。我有一个最初没有孩子的列表视图(每行有两个文本视图和一个编辑文本)。用户可以使用微调器将项目添加到此列表(工作正常)。一旦用户将所需的行数添加到列表视图中,他们就可以在出现的 editTexts 中键入数据。最后,他们点击一个保存按钮,该按钮需要从 listView 中的所有 textViews 和 editTexts 中获取数据。 @LukeStuemke :) 好吧,如果你还需要什么我在这里

以上是关于如何从具有多个视图的 ListView 中的 EditText 获取文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何检索名称 | Listview中多个选中项目的值对?

Espresso - 如何定位并单击ListView中的第一个项目

如何在 listView Xamarin Android 中使用具有多个 Textview 列的 ArrayAdapter

如何从firebase检索多个数据到android中的列表视图?

如何从具有多个数组的字典中获取特定键并存储到放置在表格视图单元格中的字符串中

如何使listView中的一行始终具有相同的颜色android