美文网首页
RecyclerView和EditText 解决方法

RecyclerView和EditText 解决方法

作者: 因为我的心 | 来源:发表于2020-05-15 10:49 被阅读0次

一、前言:

今天发现一个怪问题,在Edittext中编辑文本的时候logcat一直刷屏,打印相同的日志,导致页面卡顿,在afterTextChanged方法中做调用次数统计,确实可以触发多次。

    1. addTextChangedListener多次重复执行的问题?
    1. RecyclerView列表中的EditText 复用问题?

效果图如下:

22.jpg

二、addTextChangedListener多次重复执行的问题?:

private TextWatcher mTextWatcher;
//1、移除原来的文字改变监听,避免列表刷新或者view复用所造成TextWatcher被多次调用
 if (mTextWatcher !=null){
         mEt.removeTextChangedListener(mTextWatcher);
 }

//2 创建TextWatcher
  mTextWatcher = 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) {
     //todo
  }
  };

 //3 先移除,后添加
 mEt.addTextChangedListener(mTextWatcher);

 //4 设置值
 mEt.setText(value);

三、RecyclerView列表中的EditText 复用问题?(包含解决1的问题)

public class InStorageAdapter extends BaseQuickAdapter<InStorageBean, BaseViewHolder> {

    private TextWatcher mTextWatcher;

    public InStorageAdapter(int layoutResId, @Nullable List<InStorageBean> data) {
        super(layoutResId, data);
    }

    @Override
    protected void convert(@NonNull BaseViewHolder helper, InStorageBean item) {

        //1、布局位置
        int layoutPosition = helper.getLayoutPosition();
        EditText et_number = helper.getView(R.id.et_number);
        if (mTextWatcher != null) {
            et_number.removeTextChangedListener(mTextWatcher);
        }
        mTextWatcher = 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 editable) {
                //2、EditText监听的位置
                int position = helper.getLayoutPosition();
                //3、 输入框可见,并且布局位置和监听位置一致
                if (et_number.hasFocus() && position == layoutPosition) {
                    String str = editable.toString().trim();
                    if (!TextUtils.isEmpty(str)) {
                        int value = Integer.parseInt(str);
                        if (value > 0) {
                            //4、设置值
                            item.setInStorage(value);
                        } else {
                            item.setInStorage(0);
                        }
                    }
                }
            }
        };
        et_number.addTextChangedListener(mTextWatcher);
        //4 展示数据
        if (item.getInStorage() == 0) {
            et_number.setText("");
        } else {
            et_number.setText(String.valueOf(item.getInStorage()));
        }

    }
}

相关文章

网友评论

      本文标题:RecyclerView和EditText 解决方法

      本文链接:https://www.haomeiwen.com/subject/kjgqohtx.html