所以,我想让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<MyModel>(this@MainActivity, MyModel::class.java, android.R.layout.simple_list_item_1, ref) {
override fun populateView(v: View, model: MyModel, position: Int) {
v.findViewById<TextView>(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"]
},
}
}
不知何故,结果,我输入&gt; 1个字符,无论字符是什么,总是像这样(按照确切的顺序)。
beef
vegetable
bean
(我的意思是&#34;无论&#34;当然包括以下每一个字符串:&#34;牛肉&#34;,&#34;蔬菜&#34;或&#34; bean&#34;(一次1个单词),甚至是无意义的键盘组合,例如&#34; igiviibbi&#34;)
P.S还有一些我修剪过的代码以缩短代码段,例如:
suggestionAdapter.cleanup()
在createNewSuggestionAutoComplete()
P.S.S其他细节。
MyModel
而不仅仅是String
的原因是因为我还要添加其他字段。startAt()
之前尝试了equalTo()
,但它们都显示/显示完全相同的问题/结果。有关如何在FirebaseQuery
中指定的ref
正确显示数据的任何建议吗?
答案 0 :(得分:0)
原来我错误地实施了FirebaseListAdapter
。
我应该将Query
而不是DatabaseReference
传递给FirebaseListAdapter
最后一个参数。 (编辑器没有发现错误,因为DatabaseReference
也继承自Query
)
所以,它应该是:
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<MyModel>(this@MainActivity, MyModel::class.java, android.R.layout.simple_list_item_1, q) {
override fun populateView(v: View, model: MyModel, position: Int) {
v.findViewById<TextView>(android.R.id.text1).text = model.name
}
不幸的是,Firebase中的startAt()
不是startWith()
,而是返回beef
&amp; bean
当您输入bee
时,它会返回每个节点,从name = bee
开始(确切地说是“bee”),直到最后一个节点(如果您不要指定endAt()
。
如果找不到任何bee
,它将返回所有节点。
如果您想使用startWith()
之类的内容,遗憾的是Firebase仍然不支持此类查询。
但是,有一个名为QueryBase的库可能对您的案例有所帮助。它也是由firebaser写的。 (仅限JS)
这也可能对您有所帮助Android - Firebase query startAt not working as expected