ListView中EditText焦点问题

来源:互联网 发布:js new string a 编辑:程序博客网 时间:2024/05/06 10:53

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

源码

0 0
原创粉丝点击