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

文章介绍了如何通过使用同一个TextWatcher实例为多个EditText设置监听器,以实现实时查询功能。当EditText中的文本发生变化时,会触发监听器并执行特定的查询操作,简化了代码并提高了效率。
摘要由CSDN通过智能技术生成

前言

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


一、尝试解释

网上的解释是:对于某些 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。写到最后,我觉得我的内容和标题好像有点出入,但是不知道要怎么修改表达才能准确一点,我语文真的太差了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值