FirebaseListAdapter忽略orderByChild()和equalTo()

所以,我想让FirebaseListAdapter显示自动填充建议,因为在用户输入至少X(在我的情况下,1)字符。

 val mSearchSuggestionsListView = findViewById(R.id.main_list_view) as ListView var suggestionAdapter: FirebaseSuggestionAdapter? = null mSearchEditText.editText.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(editable: Editable) { if (editable.length > 1) { ... createNewSuggestionAutoComplete(editable.toString().toLowerCase()) ... } else { mSearchSuggestionsListView.adapter = null } } ... //Other overrides trimmed }) fun createNewSuggestionAutoComplete(query: String) { val ref = FirebaseDatabase.getInstance().getReference("myModels") .orderByChild("name").equalTo(query).ref suggestionAdapter = FirebaseSuggestionAdapter(ref) ... mSearchSuggestionsListView.adapter = suggestionAdapter ... } inner class FirebaseSuggestionAdapter(ref: DatabaseReference) : FirebaseListAdapter(this@MainActivity, MyModel::class.java, android.R.layout.simple_list_item_1, ref) { override fun populateView(v: View, model: MyModel, position: Int) { v.findViewById(android.R.id.text1).text = model.name } } 

这里是MyModel类:

 class MyModel(var name: String) 

以下是实时数据库中的数据:

 -myModels --0 ---name: "beef" --1 ---name: "vegetable" --2 ---name: "bean" 

以上数据库的firebase索引规则如下:

 { "rules": { "myModels": { ".indexOn": ["name"] }, } } 

不知何故,结果,在输入> 1个字符后,不管字符是什么,总是像这样(按照这个顺序)。

 beef vegetable bean 

(我的意思是“不管”,当然包括以下每一个字符串:“牛肉”,“蔬菜”或“豆”(一次一个字),甚至是一个无意义的键盘组合“igiviibbi”)

PS我修剪了一些代码来缩短代码片段,例如:

  1. 每次打字后延迟显示建议以防止过度呼叫。
  2. createNewSuggestionAutoComplete()开始创建它的一个新实例之前,调用suggestionAdapter.cleanup() createNewSuggestionAutoComplete()

PSS其他细节。

  1. 我使用MyModel而不是单纯的String的原因是因为我想添加一些其他字段。
  2. 我在上面的代码中使用了equalTo()之前,我尝试了startAt() ,但是它们都显示了完全相同的问题/结果。
  3. Btw上面的代码是写在Kotlin。 但是我认为这不是问题的原因。

任何关于如何正确显示数据的建议作为FirebaseQueryref指定?

原来我错误地实现了FirebaseListAdapter

我应该将Query而不是DatabaseReference传递给FirebaseListAdapter最后一个参数。 (编辑器没有发现错误,因为DatabaseReference也从Queryinheritance)

所以,它应该是:

 fun createNewSuggestionAutoComplete(query: String) { val q = FirebaseDatabase.getInstance().getReference("myModels") .orderByChild("name").equalTo(query) suggestionAdapter = FirebaseSuggestionAdapter(q) ... mSearchSuggestionsListView.adapter = suggestionAdapter ... } inner class FirebaseSuggestionAdapter(q: Query) : FirebaseListAdapter(this@MainActivity, MyModel::class.java, android.R.layout.simple_list_item_1, q) { override fun populateView(v: View, model: MyModel, position: Int) { v.findViewById(android.R.id.text1).text = model.name } 

不幸的是,Firebase中的startWith()不是startWith() ,所以当你输入bee ,它不是返回beefbean ,而是返回每个节点 ,直到最后一个节点(如果是“bee”你不指定endAt()

如果没有find任何bee它会返回所有节点。

如果您想使用类似startWith() ,不幸的是,Firebase仍然不支持这种查询。

然而,有一个名为QueryBase的库可能有助于你的情况。 它也是由firebaser写的。 (仅JS)

这可能会帮助你, Android – Firebase查询开始不按预期工作