ListView或RecyclerView嵌套EditText出现复用问题的解决方式

众所周知,使用listview时,出现大量数据的时候都会采用复用的写法,而recyclerView里已经有了复用的机制了。而因为复用的关系,如果item布局当中涉及到edittext等一些控件时,就会出现因为复用而产生的数据错乱。

特别是在item设置数据的时候,如果你的edittext有加入TextWatcher事件监听,而且有在afterTextChanged对文本进行操作的话,这时候,你没办法给edittext设置文本,因为一设置文本,就会触发afterTextChanged方法进行操作,然后就会出现一系列问题。

解决方式是,在加入TextWatcher事件之前,先判断edittext是否已经加入了TextWatcher事件,如果有,就先移除,然后给edittext设置文本之后再加入TextWatcher事件,这里可以通过tag标签来处理,具体实现方法如下:
(java写法)

	//判断是否有TextWatcher监听事件,有的话先移除
	if (holder.editText.getTag(R.id.search_key) instanceof TextWatcher){
                holder.editText.removeTextChangedListener(((TextWatcher) holder.editText.getTag(R.id.search_key)));
            }
			//移除了TextWatcher事件后设置item对应的文本
            holder.editText.setText("新文本");

            TextWatcher textWatcher=new TextWatcher() {
                @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) {
                    beans.get(i).setValue(s.toString());
                }
            };
			//设置tag为TextWatcher
            holder.editText.addTextChangedListener(textWatcher);
            holder.editText.setTag(R.id.search_key,textWatcher);

(kotlin写法)

if (editText.getTag(R.id.item_add_inputs) is TextWatcher){
                editText.removeTextChangedListener(editText.getTag(R.id.item_add_inputs) as TextWatcher)
            }

            editText.setText(data.content)

            var textWatcher:TextWatcher = object : TextWatcher{
                override fun afterTextChanged(s: Editable?) {
                    data.content = s.toString()
                }

                override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
                }

                override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                }

            }

            editText.addTextChangedListener(textWatcher)
            editText.setTag(R.id.item_add_inputs,textWatcher)

已经第二次遇到这个问题了,所以做一下记录。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值