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

时间:2015-12-28 20:31:04

标签: java android listview android-listview android-edittext

我有一个列表视图,每行有多个edittexts。我想从每个Edittexts及其位置获取值,以便我可以在mainactivity上调用它们。 我尝试使用hashmap等,但我不能让它们中的任何一个工作。 我花了几天时间试图解决这个问题,同时查看堆栈溢出的答案并且还没有解决它。 我知道我应该实现textwatcher并使用position保存hashmap上的更改。 到目前为止,我可以毫无问题地获得整个listview的位置。当我向上和向下滚动时,我唯一遇到的问题就是不会丢失edittexts的内容。这是我的代码。代码运行没有问题!

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) { }
};


}

Here is the image of it running

1 个答案:

答案 0 :(得分:0)

为了简单起见,您可以使用它标识每个EditText标记&#39;属性。 android中的Listview将重用视图,并通过在每个getView&#39;中为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&#39;中实现它。像这样:

@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的积分转到: How to get the View in TextWatcher method context?