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我修剪了一些代码来缩短代码片段,例如:
- 每次打字后延迟显示建议以防止过度呼叫。
- 在
createNewSuggestionAutoComplete()
开始创建它的一个新实例之前,调用suggestionAdapter.cleanup()
createNewSuggestionAutoComplete()
PSS其他细节。
- 我使用
MyModel
而不是单纯的String
的原因是因为我想添加一些其他字段。 - 我在上面的代码中使用了
equalTo()
之前,我尝试了startAt()
,但是它们都显示了完全相同的问题/结果。 - Btw上面的代码是写在Kotlin。 但是我认为这不是问题的原因。
任何关于如何正确显示数据的建议作为FirebaseQuery
在ref
指定?
原来我错误地实现了FirebaseListAdapter
。
我应该将Query
而不是DatabaseReference
传递给FirebaseListAdapter
最后一个参数。 (编辑器没有发现错误,因为DatabaseReference
也从Query
inheritance)
所以,它应该是:
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
,它不是返回beef
和bean
,而是返回每个节点 ,直到最后一个节点(如果是“bee”你不指定endAt()
。
如果没有find任何bee
它会返回所有节点。
如果您想使用类似startWith()
,不幸的是,Firebase仍然不支持这种查询。
然而,有一个名为QueryBase的库可能有助于你的情况。 它也是由firebaser写的。 (仅JS)
这可能会帮助你, Android – Firebase查询开始不按预期工作