我有一个列表视图,每行有多个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) { }
};
}
答案 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?