【Android 实现有多个筛选条件时,进行实时查询——多个“按钮”共用addTextChangedListener】

前言

在做项目时,我们经常会使用筛选功能,通常会有多个筛选条件,我们一般会选择多个筛选条件组装之后再进行查询,但现在我所需要的功能是有多个筛选条件也能实现实时查询。


一、尝试解释

网上的解释是:对于某些 EditTexts,它不是 TextWatcher 的一个实例。对于 n EditTexts,它是一个类和该类的 n个实例。 每个 EditText 都有自己的 Spannable。 TextWatcher 的事件有这个 Spannable 作为 s参数。我检查他们的 hashCode (每个对象的唯一 ID)。 myEditText1.getText() 返回Spannable。
因此,如果 myEditText1.getText().hashCode() 等于 s.hashCode() 这意味着s 属于 myEditText1 。因此,需要提供一个 TextWatcher 实例。

按我的理解为:多个按钮都想使用同一个监听函数,并且监听变化后执行的事件也是同一个,那么就不用每个按钮都写一遍监听事件,我们再建一个按钮A,然后之前所有的按钮来调用这个唯一的按钮。

每个按钮自己监听的代码如下:

     //姓名
    @BindView(R.id.EditUsername)
    EditText mEditUsername;
    //电话
    @BindView(R.id.EditPhone)
    EditText mEditPhone;
    //身份证号码
    @BindView(R.id.EditSFZH)
    TextView mEditSFZH;

   @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_index);

        mEditUsername.addTextChangedListener(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) {
    
    
            }
        });
        mEditPhone.addTextChangedListener(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) {
    
    
            }
        });
        mEditSFZH.addTextChangedListener(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) {
    
    
           searchAssemble();//在这里写自己的查询
            }
        });
 }

这能实现的是:只要你的任何一个输入框有变化,它都会执行你的查询。

二、简单写法

代码如下(示例):

   //姓名
   @BindView(R.id.EditUsername)
    EditText mEditUsername;
    //电话
    @BindView(R.id.EditPhone)
    EditText mEditPhone;
    //身份证号码
    @BindView(R.id.EditXZQ)
    TextView mEditSFZH;

   @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_index);

        mEditUsername.addTextChangedListener(generalTextWatcher);
        mEditPhone.addTextChangedListener(generalTextWatcher);
        mEditSFZH.addTextChangedListener(generalTextWatcher);
}
   private TextWatcher generalTextWatcher = new TextWatcher() {
    
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                                  int count) {
    
    
        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                                      int after) {
    
    
        }
        @Override
        public void afterTextChanged(Editable s) {
    
    
            searchAssemble();
        }
    };

总结

EditText 和TextView都可以使用addTextChangedListener。写到最后,我觉得我的内容和标题好像有点出入,但是不知道要怎么修改表达才能准确一点,我语文真的太差了。

猜你喜欢

转载自blog.csdn.net/m0_44980493/article/details/128972575