android - 使用 Firestore 按键入的字母搜索
问题描述
我尝试Firestore
使用我输入的字母将搜索集成到集合中EditText
。我的意思是,我怎样才能在没有任何按钮的情况下做到这一点,只是实时搜索,即当我输入任何字母EditText
并且结果出现在ListView
.
我的班级,我从 Firestore 中检索了所有记录:
public class AllPlaces extends AppCompatActivity {
private EditText eName;
private ListView mList;
private FirebaseFirestore firestore = FirebaseFirestore.getInstance();
private CollectionReference reference = firestore.collection("Users");
private SearchAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_all_places);
mList = findViewById(R.id.listSearch);
eName = findViewById(R.id.editSearch);
reference.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
List<SearchModel> names = new ArrayList<>();
if(task.isSuccessful()){
for(QueryDocumentSnapshot document : task.getResult()) {
SearchModel model = document.toObject(SearchModel.class);
names.add(model);
}
mList = findViewById(R.id.listSearch);
adapter = new SearchAdapter(AllPlaces.this, names);
mList.setAdapter(adapter);
}
}
});
}
}
更新:
我找到了这个解决方案,但是当我输入一些字母时它不能正常工作 - 所有信息都从ListView
:
eName.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) {
AllPlaces.this.adapter.getFilter().filter(s);
}
@Override
public void afterTextChanged(Editable s) {
}
});
解决方案
private FirebaseFirestore firestore = FirebaseFirestore.getInstance();
private CollectionReference reference = firestore.collection("Users");
Query q;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_all_places);
q = firestore.collection("Users");
showAdapter(q);
eName.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (charSequence.toString().length() == 0) {
q = firestore.collection("Users");
showAdapter(q);
} // This is used as if user erases the characters in the search field.
else {
q = reference.orderBy("name").startAt(charSequence.toString().trim()).endAt(charSequence.toString().trim() + "\uf8ff"); // name - the field for which you want to make search
showAdapter(q);
}
adapter.notifyDataSetChanged();
}
@Override
public void afterTextChanged(Editable editable) {
}
});
void showAdapter(Query q1) {
q1.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
List<SearchModel> names = new ArrayList<>();
if(task.isSuccessful()){
for(QueryDocumentSnapshot document : task.getResult()) {
SearchModel model = document.toObject(SearchModel.class);
names.add(model);
}
mList = findViewById(R.id.listSearch);
adapter = new SearchAdapter(AllPlaces.this, names);
mList.setAdapter(adapter);
}
}
});
}
我希望这个能帮上忙 ..
推荐阅读
- swift - 如何从 Firebase 解码一个空数组?
- python - 在 Python 中同时保存 float 和 int 到文件
- python - 如何在 python 中使用 PIL 将文本居中放在图像上,并在 for 或 while 循环中使用不同的名称保存图像?
- javascript - Google Script doPost 仅接受来自单个 URL 的
- typescript - 如何使用 comlink 抛出/捕获自定义错误。打字稿
- javascript - 如何向图像滑块添加过渡/动画?
- r - 在 GLM 分析中使用小鼠输入的数据集;可以获得合并模型拟合指数吗?
- vba - VBA Word 宏选择插入的形状
- python - 如何在地图上绘制一些引用的标签?使用卡托比
- python-3.x - Python 类,更新