FirebaseRecyclerAdapter 时,键入以自动完成方式加载数据的文本字段。我曾经在onTextChanged
方法的帮助下调用以下函数firebaseUserSearch
来填充适配器。每次调用firebaseUserSearch
时,如果结果已经存在,它都会刷新我不想要的回收器视图。
private void firebaseUserSearch(String searchText) {
Query firebaseSearchQuery = mUserDatabase.orderByChild("name").startAt(searchText).endAt(searchText + "uf8ff");
FirebaseRecyclerAdapter<Users, SearchActivity.UsersViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Users, SearchActivity.UsersViewHolder>(
Users.class,
R.layout.list_layout,
SearchActivity.UsersViewHolder.class,
firebaseSearchQuery
) {
@Override
protected void populateViewHolder(SearchActivity.UsersViewHolder viewHolder, final Users model, final int position) {
viewHolder.setDetails(getActivity().getApplicationContext(), model.getName(), model.getPlace(), model.getImage());
viewHolder.relLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), ResultActivity.class);
intent.putExtra("name", model.getName());
intent.putExtra("place", model.getPlace());
intent.putExtra("image", model.getImage());
startActivity(intent);
}
});
}
};
mResultList.setAdapter(firebaseRecyclerAdapter);
}
onTextChanged
会在您在文本字段中键入内容时触发。
您可能希望使用afterTextChanged
。
这是一个例子——
editText.addTextChangedListener(
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) { }
private Timer timer=new Timer();
private final long DELAY = 500; // milliseconds
@Override
public void afterTextChanged(final Editable s) {
timer.cancel();
timer = new Timer();
timer.schedule(
new TimerTask() {
@Override
public void run() {
// TODO: do what you need here (refresh list)
// you will probably need to use runOnUiThread(Runnable action) for some specific actions
}
},
DELAY
);
}
}
);
每次更改搜索词时,都会创建一个新查询和一个新适配器,这会导致完全重新加载(和重新绘制(数据。标准FirebaseRecyclerAdapter
无法阻止这种情况。
如果您想要一个更智能的适配器,则必须自己创建它。您必须将从查询中返回的每个项目与已有的项目进行比较,并且仅将实际更改传递给适配器。
虽然这绝对是可能的,但这是相当多的工作。如果您在此过程中遇到困难,请随时发布一个问题,重现您遇到困难的地方。