天天看点

ListView中EditText焦点问题

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 = -;

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

    @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 != - && 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());
        }
    }

}
           

源码