android - RecyclerView 项目不过滤
问题描述
我需要按名称过滤我的 recyclerview 项目。为此,我使用 rxjava(去抖动运算符),查看绑定。但是当我在我的edittext中输入一些文本并且recyclerview没有被过滤时。这是我的代码。主要活动:
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
public static final String DATABASE_NAME = "dataDb";
private ProgressBar progressBar;
@BindView(R.id.rv_data_list)
RecyclerView recyclerDataList;
private MyAdapter adapter;
private AppDatabase db;
private SwipeRefreshLayout swipeRefreshToUpdateList;
private TextView tvErrorMessage;
private List<Data> listData;
private CompositeDisposable cDisposable = new CompositeDisposable();
private Unbinder unbinder;
private Disposable disposable;
@BindView (R.id.edit_search)
EditText editSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
unbinder = ButterKnife.bind(this);
progressBar = findViewById(R.id.pb_wait);
swipeRefreshToUpdateList = findViewById(R.id.srl_update_data_list);
tvErrorMessage = findViewById(R.id.tv_error_text);
Toolbar toolbar = findViewById(R.id.tb_toolbar_main);
setSupportActionBar(toolbar);
editSearch.setVisibility(View.VISIBLE);
listData = new ArrayList<>();
db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, DATABASE_NAME).build();
recyclerDataList.setLayoutManager(new LinearLayoutManager(this));
adapter = new MyAdapter(listData);
recyclerDataList.setAdapter(adapter);
hideKeyboard();
swipeRefreshListener();
recyclerTouchListListener();
disposable = db.dataDao().dataSize()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe((dbSize) -> {
if(dbSize > 0) {
fillListFromDb();
}
else
getData();
}, this :: onErrorShow
, this :: onCompleteShow
);
cDisposable.add(RxTextView.textChangeEvents(editSearch)
.skipInitialValue()
.debounce(100, TimeUnit.MILLISECONDS)
.filter(new Predicate<TextViewTextChangeEvent>() {
@Override
public boolean test(TextViewTextChangeEvent textViewTextChangeEvent) throws Exception {
return TextUtils.isEmpty(textViewTextChangeEvent.text().toString()) || textViewTextChangeEvent.text().toString().length() > 2;
}
})
.distinctUntilChanged()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(searchContacts()));
}
private DisposableObserver<TextViewTextChangeEvent> searchContacts() {
return new DisposableObserver<TextViewTextChangeEvent>() {
@Override
public void onNext(TextViewTextChangeEvent textViewTextChangeEvent) {
Log.d(TAG, "Search query: " + textViewTextChangeEvent.text());
adapter.getFilter().filter(textViewTextChangeEvent.text());
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " + e.getMessage());
}
@Override
public void onComplete() {
}
};
}
在我的适配器 getFilter 方法中:
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
dataFiltered = mData;
} else {
List<Data> filteredList = new ArrayList<>();
for (Data row : mData) {
if (row.getName().toLowerCase().contains(charString.toLowerCase()) ) {
filteredList.add(row);
}
}
dataFiltered = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = dataFiltered;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
dataFiltered = (ArrayList<Data>) filterResults.values;
notifyDataSetChanged();
}
};
}
请帮我。我是 rxJava 的新手,我需要一些帮助。
解决方案
推荐阅读
- firebase - 具有云功能的异步功能(异步语法错误)
- google-bigquery - BigQuery 表的架构与配方不匹配
- prolog - 断言的数据不同
- php - PHP Random Variable
- java - 如何从android中的联系人读取电子邮件字段?
- java - 如何从记事本文本文件中获取数据并创建 Java 对象集合?
- javascript - 有没有办法在给定的持续时间内更改跨度文本的颜色?
- spring-batch - Spring Batch 中的步骤测试
- laravel-5.7 - Laravel,如何创建验证多个输入的规则
- couchbase - couchbase,为什么这个查询返回零结果