Java 从Listview上的Edittext字段获取所有值(超过10个Edittext)

Java 从Listview上的Edittext字段获取所有值(超过10个Edittext),java,android,listview,android-listview,android-edittext,Java,Android,Listview,Android Listview,Android Edittext,我有一个列表视图,每行有多个编辑文本。我想从每个EditText及其位置获取值,以便在mainactivity上调用它们。 我试着使用hashmap等工具,但都没用。 我花了好几天的时间在寻找关于堆栈溢出的答案时试图弄明白这一点,但还没有解决它。 我知道我应该实现textwatcher并将更改保存在hashmap上的position中。 到目前为止,我可以毫无问题地获得整个listview的位置。我唯一遇到的问题是当我上下滚动时不会丢失编辑文本的内容。这是我的密码。代码运行没有问题 packag

我有一个列表视图,每行有多个编辑文本。我想从每个EditText及其位置获取值,以便在mainactivity上调用它们。 我试着使用hashmap等工具,但都没用。 我花了好几天的时间在寻找关于堆栈溢出的答案时试图弄明白这一点,但还没有解决它。 我知道我应该实现textwatcher并将更改保存在hashmap上的position中。 到目前为止,我可以毫无问题地获得整个listview的位置。我唯一遇到的问题是当我上下滚动时不会丢失编辑文本的内容。这是我的密码。代码运行没有问题

package com.example.jung.evergreen;


public class InteractiveArrayAdapter extends ArrayAdapter {
private int editingPosition=0;
private final List<String> list;
String text[];
private final Activity context;
public ArrayList myItems = new ArrayList();
private HashMap<String, String> textValues = new HashMap<String, String>();

public InteractiveArrayAdapter(Activity context, List<String> list) {
    super(context, R.layout.item, list);
    this.context = context;
    this.list = list;
    text=new String[list.size()];
}

static class ViewHolder {
    protected TextView text;
    protected EditText editbox;

}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View view = null;
    int temp = position;
    ViewHolder holder = null;
    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        holder = new ViewHolder();
        convertView = mInflater
                .inflate(R.layout.item, parent, false);

        holder.text = (TextView) convertView.findViewById(R.id.textView3);
        holder.editbox = (EditText) convertView.findViewById(R.id.editText);
        holder.editbox.setTag(position);


        convertView.setTag(holder);
    }
    else
    {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.text.setText(list.get(position));
    holder.editbox.setText(text[temp]);

    holder.editbox.removeTextChangedListener(watcher);





    holder.editbox.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                editingPosition = position;
                //   final int position = v.getId();
                //    final EditText Caption = (EditText) v;
                //    String val = Caption.getText().toString();  // you have the value here
                //    Log.e("Hellooooooooooo", val);

                //    if (val.compareTo("") != 0) {
                //       String accountName = "";
                //       if (Caption.getTag() != null) {
                //           accountName = Caption.getTag().toString();  // get the tag

                //       }
                //   }

            }
        }
    });

    holder.editbox.addTextChangedListener(watcher);

    return convertView;
}


private TextWatcher watcher = new TextWatcher() {
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        text[editingPosition] = s.toString();
        textValues.put(text[editingPosition], s.toString());
        Log.e("IT CHANGED", text[editingPosition] + " on " + editingPosition);
    }
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
public void afterTextChanged(Editable s) { }
};


}
package com.example.jung.evergreen;
公共类InteractiveArrayAdapter扩展了ArrayAdapter{
私有int编辑位置=0;
私人最终名单;
字符串文本[];
私人最终活动背景;
public ArrayList myItems=new ArrayList();
私有HashMap textValues=新HashMap();
公共InteractiveArrayAdapter(活动上下文、列表){
超级(上下文、右布局、项目、列表);
this.context=上下文;
this.list=列表;
text=新字符串[list.size()];
}
静态类视窗夹{
受保护的文本查看文本;
受保护的编辑文本编辑框;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图=空;
内部温度=位置;
ViewHolder=null;
LayoutInflater mInflater=(LayoutInflater)上下文
.getSystemService(活动.布局\充气机\服务);
if(convertView==null){
holder=新的ViewHolder();
convertView=mInflater
.充气(右布局项,父项,假);
holder.text=(TextView)convertView.findViewById(R.id.textView3);
holder.editbox=(EditText)convertView.findViewById(R.id.EditText);
holder.editbox.setTag(位置);
convertView.setTag(支架);
}
其他的
{
holder=(ViewHolder)convertView.getTag();
}
holder.text.setText(list.get(position));
holder.editbox.setText(text[temp]);
holder.editbox.removeTextChangedListener(观察者);
holder.editbox.setOnFocusChangeListener(新视图.OnFocusChangeListener(){
@凌驾
public void onFocusChange(视图v,布尔hasFocus){
如果(!hasFocus){
编辑位置=位置;
//最终int位置=v.getId();
//最终编辑文本标题=(编辑文本)v;
//String val=Caption.getText().toString();//这里有值
//Log.e(“hellooo”,val);
//如果(val.compareTo(“”)=0){
//字符串accountName=“”;
//if(Caption.getTag()!=null){
//accountName=Caption.getTag().toString();//获取标记
//       }
//   }
}
}
});
holder.editbox.addTextChangedListener(观察者);
返回视图;
}
私有TextWatcher watcher=新TextWatcher(){
public void onTextChanged(字符序列、int start、int before、int count){
text[editingPosition]=s.toString();
textValues.put(text[editingPosition],s.toString());
Log.e(“它已更改”,文本[editingPosition]+”在“+editingPosition”上);
}
public void beforeTextChanged(字符序列s、int start、int count、int after){}
公共无效后文本更改(可编辑的s){}
};
}

为了简化操作,您可以使用每个EditText的“tag”属性来标识它。android中的Listview将重用视图,通过在每个“getView”中为EditText设置一个标记,您将能够在TextWatcher中接收它的位置

首先扩展您自己的TextWatcher,以便它可以保存对视图的引用:

public static class CustomTextWatcher implements TextWatcher {

    private EditText mEditText;

    public MyTextWatcher(EditText editText) {
       mEditText = editText;
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        final int position = Integer.valueOf(mEditText.getTag().toString())
        text[position] = s.toString();

        ...
     }
}
然后在“getView”中实现它,如下所示:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    ... 

    holder.text.setText(list.get(position));
    holder.editbox.setTag(position);

    holder.editbox.addTextChangedListener(new CustomTextWatcher(holder.editbox));

    ...

    return convertView;
}
自定义TextWatcher的积分转到:

只是一个想法。您可以简单地使用以下方法:将您的编辑文本命名为1、2等,然后使用while语句和您的位置来匹配编辑文本的id,您可以将其保存到列表中,从中可以获得所需的值。这就是数组的方便之处。设置编辑文本(文本)时,将数组文本(项目)设置在数组中与listview项目位置相同的位置。然后,只要在需要值时读取数组,还可以在edittext位置设置文本,以便在上下滚动时插入文本,这样就不会丢失文本。谢谢您的帮助。有了这个和更多的研究,我能够让它运行!很乐意帮忙。祝你的项目好运!;)