在listView中更改了editText

时间:2014-12-27 21:56:02

标签: android android-arrayadapter

大家晚上好, 我的计划是,获取已由listview填充的已更改editText的值。到目前为止,我可以通过适配器中的addTextChangedListener函数看到更改的值,但我不知道如何将值返回给主类。 这是我的适配器类:

import android.app.Activity;
import android.text.TextWatcher;
import android.text.Editable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.TextView;

import com.hobbyathletes.hobbyathletes.R;


public class EventRefAdapter extends ArrayAdapter<String> {

private final Activity context;
private final String[] string_myeventref;
private final String[] string_myeventref_value;

public EventRefAdapter(Activity context, String[] string_myeventref, String[] string_myeventref_value) {
    super(context, R.layout.list_item_myeventref, string_myeventref);

    this.context = context;
    this.string_myeventref = string_myeventref;
    this.string_myeventref_value = string_myeventref_value;

}

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

    final ViewHolder holder;
    if (view == null) {
        holder = new ViewHolder();
        LayoutInflater inflater = context.getLayoutInflater();
        view = inflater.inflate(R.layout.list_item_myeventref, null, true);
        holder.txtname = (TextView) view.findViewById(R.id.textView_myeventref_name);
        holder.edtxtvalue = (EditText) view.findViewById(R.id.editText_myeventref_value);

        view.setTag(holder);

    } else {

        holder = (ViewHolder) view.getTag();
    }

    holder.ref = position;

    holder.txtname.setText(string_myeventref[position]);
    holder.edtxtvalue.setText(string_myeventref_value[position]);

    holder.edtxtvalue.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) {
            // TODO Auto-generated method stub
            string_myeventref_value[holder.ref] = arg0.toString();
            System.out.println("Text changed: " + arg0.toString());
        }
    });

    return view;
}

private class ViewHolder {
    TextView txtname;
    EditText edtxtvalue;
    int ref;
}
}

在我的主要课程中,我这样称呼它:

String[] string_myeventref = new String[] {"My Startnumber:", "Total Distance:", "Total Time:"};
String[] string_myeventref_value = new String[] {mER.getBib(), mER.getTotald(), mER.getTotalt()};
adapter = new EventRefAdapter(myeventref.this, string_myeventref, string_myeventref_value);
list=(ListView)findViewById(R.id.listView_eventref);
list.setAdapter(adapter);

所以我的最终目标是,重新填充mER对象,以及原始对象的副本;) 同样不错的是,在editText字段被保留之后获取值的一种方法,但我认为如果我写每个更改或只是完整的更改,这并不重要。

谢谢md

更新: 我将我的适配器类更改为此类似乎现在可以工作,必须检查它:

    public View getView(int position, View view, ViewGroup parent) {

    View rowView = view;
    ViewHolder holder = null;
    final myeventref.MyEventRefRow item = elements.get(position);

    if (rowView == null) {

        //LayoutInflater inflater = context.getLayoutInflater();
        rowView = context.getLayoutInflater().inflate(layoutResourceId, null, true);

        holder = new ViewHolder();
        holder.txtname = (TextView) rowView.findViewById(R.id.textView_myeventref_name);
        holder.edtxtvalue = (EditText) rowView.findViewById(R.id.editText_myeventref_value);

        rowView.setTag(holder);

    } else {

        holder = (ViewHolder) rowView.getTag();
    }

    if (holder.textWatcher != null) {
        holder.edtxtvalue.removeTextChangedListener(holder.textWatcher);
    }

    holder.textWatcher = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            item.setValue(s.toString());
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    };
    holder.edtxtvalue.addTextChangedListener(holder.textWatcher);

    holder.txtname.setText(item.getName());
    holder.edtxtvalue.setText(item.getValue());

    return rowView;
}

1 个答案:

答案 0 :(得分:0)

执行此操作的一种简单方法是让您的活动使用void fieldUpdated(int position, String value)等方法实现接口。然后,在afterTextChanged()中,您可以执行此操作:

((MyInterface)context).fieldUpdated(holder.red, arg0.toString());

(请注意,在main活动中执行fieldUpdated需要引用要更新的String数组,因此您可能希望将它们作为类的成员变量。)

这是一个非常简单的实现,称为observer pattern