前言
在做项目时,我们经常会使用筛选功能,通常会有多个筛选条件,我们一般会选择多个筛选条件组装之后再进行查询,但现在我所需要的功能是有多个筛选条件也能实现实时查询。
一、尝试解释
网上的解释是:对于某些 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。写到最后,我觉得我的内容和标题好像有点出入,但是不知道要怎么修改表达才能准确一点,我语文真的太差了。