如何从具有多个视图的 ListView 中的 EditText 获取文本?
How to get text from EditText within ListView with multiple Views?
我有一个 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;
}
}
}
getFocusedChild(position) 它将 return 一个视图,或者 findFocus()
View row = ingredient_list.getFocusedChild();
EditText et = (EditText)row.findViewById(R.id.ingredient_qty_in_new_meal_editText);
编辑
抱歉我误解了创建要点将与输入一起敬酒
对于那些可能有类似问题的人,我解决了我遇到的问题。
问题:
需要获取在 listView 中包含的多个 editText 中输入的值。使用 listviewname.getItemAtPosition(integer) 仅获取第一个 editText 的值。此外,我在listview的每一行中包含多个视图,因此getItemAtPosition只返回listView第一行中第一个视图的值。
解决方法:
- 定义一个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();
}
我有一个 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;
}
}
}
getFocusedChild(position) 它将 return 一个视图,或者 findFocus()
View row = ingredient_list.getFocusedChild();
EditText et = (EditText)row.findViewById(R.id.ingredient_qty_in_new_meal_editText);
编辑
抱歉我误解了创建要点将与输入一起敬酒
对于那些可能有类似问题的人,我解决了我遇到的问题。
问题: 需要获取在 listView 中包含的多个 editText 中输入的值。使用 listviewname.getItemAtPosition(integer) 仅获取第一个 editText 的值。此外,我在listview的每一行中包含多个视图,因此getItemAtPosition只返回listView第一行中第一个视图的值。
解决方法:
- 定义一个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();
}