Android中Listview嵌套Editext

参悟网址:ListView套用EditText完美解决方案_qiantanlong的博客-优快云博客

问题说明:

        listview中嵌套Editext会导致焦点获取问题,输入的内容混乱问题、无法正常输入问题等等

原因:

        ListView的自条目会复用控件,导致edittext数据混乱,焦点的获取出现问题

Activity

public class ListViewActivity extends Activity {
    private ListView lv_list;
    private ItemAdapter itemAdapter;
    private List<Bean> list;
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            if (itemAdapter!=null){
                itemAdapter.notifyDataSetChanged();
            }
        }
    };
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        list = new ArrayList<>();
        lv_list = findViewById(R.id.lv_list);
        itemAdapter = new ItemAdapter(this,list);
        lv_list.setAdapter(itemAdapter);
        itemAdapter.setOnItemClick(new ItemAdapter.OnListener() {
            @Override
            public void onItemClickListener(int i,Bean bean) {
                System.out.println("条目点击事件");
            }
        });
    }
}

基类

clas Bean{
	public String name;
	public String note;
}

重点:适配器

public class ItemAdapter extends BaseAdapter implements View.OnClickListener, View.OnTouchListener, View.OnFocusChangeListener,
	View.OnLongClickListener{

    private Context context;
    private List<Bean> list;
    public ItemAdapter(Context context, List<Bean> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View convertView, ViewGroup viewGroup) {
        ViewHolder viewHolder = null;
        if (convertView == null){
            convertView = LayoutInflater.from(context).inflate(R.layout.item_list, null);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.et_item.setOnTouchListener(this);
        viewHolder.et_item.setOnFocusChangeListener(this);
        viewHolder.et_item.setTag(i);

        Bean bean = list.get(i);
        viewHolder.tv_item.setText(bean.name);
        if (selectedEditTextPosition != -1 && i == selectedEditTextPosition) { // 保证每个时刻只有一个EditText能获取到焦点
            viewHolder.et_item.requestFocus();
        } else {
            viewHolder.et_item.clearFocus();
        }
		//ll_item是布局item_list中父控件的ID
        convertView.setTag(R.id.ll_item, i); // 应该在这里让convertView绑定position
        convertView.setOnClickListener(this);
        convertView.setOnLongClickListener(this);
        return convertView;
    }
    private int selectedEditTextPosition = -1;
    private TextWatcher mTextWatcher = new MyTextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (selectedEditTextPosition != -1) {
                Bean bean = (Bean) getItem(selectedEditTextPosition);
                bean.note = s.toString();
				//保持条目Bean中的note是对于Editext最新的内容
            }
        }
    };
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            EditText editText = (EditText) v;
            selectedEditTextPosition = (int) editText.getTag();
        }
        return false;
    }
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        EditText editText = (EditText) v;
        if (hasFocus) {
            editText.addTextChangedListener(mTextWatcher);
        } else {
            editText.removeTextChangedListener(mTextWatcher);
        }
    }
    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.ll_item) {
            int position = (int) view.getTag(R.id.ll_item);
            listener.onItemClickListener(position,list.get(position));
        }
    }
    @Override
    public boolean onLongClick(View view) {
        if (view.getId() == R.id.ll_item) {
            int position = (int) view.getTag(R.id.ll_item);
        }
        return true;
    }

    class ViewHolder{
        @InjectView(R.id.tv_item)
        TextView tv_item;
        @InjectView(R.id.et_item)
        TextView et_item;
        ViewHolder(View view) {
            ButterKnife.inject(this, view);
        }
    }
    OnListener listener;
    public void setOnItemClick(OnListener listener){
        this.listener = listener;
    }
    public interface OnListener{
        void onItemClickListener(int position,Bean bean);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值