您必须将文本观察器添加到您的编辑文本中。我将向您展示使用 debounce 来避免在用户输入文本时更新列表的解决方案。
因此,让我们从将 textWatcher 添加到您的 edittext 字段开始:
searchField.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) {
//this one is for all letters, you can check the s length eg if(s.length() >= 3)
searchSubject.onNext(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
});
如果您不想这样做,此解决方案使用 rxjava,只需将 searchSubject 替换为调用您的搜索方法。
所以字段:
private PublishSubject<String> searchSubject = PublishSubject.create();
private Subscription searchSubscription;
private String currentSearchPrefix = "";
和订阅(调用这个方法onResume):
/**
* Subscribe to searchSubject to update list of items depends on given prefix.
* Debounce on changes 500 milliseconds
*/
private void subscribeSearch() {
searchSubscription = searchSubject
.debounce(500, TimeUnit.MILLISECONDS)
.onBackpressureLatest()
.subscribe(result -> {
currentSearchPrefix = result;
MainActivity.this.runOnUiThread(this::refreshList);
});
}
我的方法 refreshList 只是通过使用 currentSearchprefix 按字段之一过滤来更新列表。记得取消订阅 searchSubscription onPause()。