ListView中的EditText会强制获取焦点,因为ListView中的item是复用的,在监听EditText的值变化时会产生混乱。
解决方法:
public class ListAdapter extends BaseAdapter {
private Context context;
private ArrayList<Data> arrayList;
private ViewHolder viewHolder;
private HashMap<Integer, String> map = new HashMap<>();
private int index = -1;
public ListAdapter(Context context, ArrayList<Data> arrayList) {
this.context = context;
this.arrayList = arrayList;
map.clear();
}
@Override
public int getCount() {
return arrayList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = View.inflate(context, R.layout.list_item, null);
viewHolder.textView = (TextView) convertView.findViewById(R.id.tv_item);
viewHolder.editText = (EditText) convertView.findViewById(R.id.edit_item);
viewHolder.editText.setTag(position);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
viewHolder.editText.setTag(position);
}
viewHolder.textView.setText(arrayList.get(position).getItem());
int tag = (int) viewHolder.editText.getTag();
if (map.get(tag) != null && !map.get(tag).equals("")) {
viewHolder.editText.setText(map.get(tag));
} else {
viewHolder.editText.setText("" + arrayList.get(position).getEditValue());
}
viewHolder.editText.addTextChangedListener(new MyTextWatcher(viewHolder));
viewHolder.editText.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
index = (int) v.getTag();
}
return false;
}
});
viewHolder.editText.clearFocus();
if (index != -1 && index == position) {
viewHolder.editText.requestFocus();
}
return convertView;
}
private class ViewHolder {
TextView textView;
EditText editText;
}
class MyTextWatcher implements TextWatcher {
private ViewHolder holder;
public MyTextWatcher(ViewHolder holder) {
this.holder = holder;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
int pos = (int) holder.editText.getTag();
map.put(pos, s.toString());
}
}
}