我一直在寻找答案,但是这些解决方案似乎对我无效。 我在列表项中有一个TextView和一个EditText。 当用户编辑EditText时,我正在尝试更新EditText的存储值。
@Override
public View getView(int index, View convertView, ViewGroup parent) {
ViewHolder holder = null;
final int pos = index;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.user_details_list_row, parent,false);
holder = new ViewHolder();
holder.mCaptionTextView = (TextView)convertView.findViewById(id.user_detail_row_caption);
holder.mDetailEditText = (EditText)convertView.findViewById(id.user_detail_row_value);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.mDetailEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
mUserDetails.set(pos, s.toString());
}
});
holder.mCaptionTextView.setText(mUserCaptions.get(index));
holder.mDetailEditText.setText(mUserDetails.get(index),BufferType.EDITABLE);
return convertView;
}
public static class ViewHolder{
public TextView mCaptionTextView;
public EditText mDetailEditText;
}
当我这么做时,滚动会触发TextWatcher并更新值,用其他EditText中的重复文本覆盖正确的文本。
除了TextWatcher外,我还尝试了以下代码:
holder.mDetailEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus){
EditText et = (EditText)v.findViewById(id.user_detail_row_value);
mUserDetails.set(index, et.getText().toString().trim());
}
}
});
它还会更新错误的EditText。我在这里错过了什么?
编辑:也尝试过这个:
final ViewHolder testHolder = holder;
holder.mDetailEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus){
EditText et = (EditText)v.findViewById(id.user_detail_row_value);
mUserDetails.set(testHolder.ref, et.getText().toString().trim());
}
}
});
它修正了我看到的滚动变化问题,但现在在编辑其中一个EditText后,它也会更改其他一些EditText。
onFocusChange
函数中设置的索引值。每当你设置 EditText 的值时,请尝试使用setTag
方法同时设置其索引。然后在onFocusChange
方法内部使用getTag
方法进行恢复。 - zozelfelfo