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<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"] }, } } 

И как-то, результат, после того, как я набрал> 1 символ, независимо от того, что представляют собой символы, всегда, как это (в этом точном порядке).

 beef vegetable bean 

(Что я подразумеваю под «независимо от того»), конечно, включает в себя каждую из следующих строк: «говядина», «растительность» или «боб» (по одному слову за раз) и даже комбинация взлома-клавиатуры, такая как "igiviibbi")

PS Есть некоторый код, который я обрезал, чтобы сократить фрагмент, например:

  1. Задержка для отображения предложения после каждого ввода для предотвращения чрезмерного вызова.
  2. suggestionAdapter.cleanup() перед началом создания нового экземпляра в createNewSuggestionAutoComplete()

PSS Другие данные.

  1. Причина, по которой я использую MyModel вместо простой String заключается в том, что я хочу добавить и другие поля.
  2. Я также попробовал startAt() прежде чем делать это с помощью equalTo() в приведенном выше коде, но оба они выполняют / отображают ту же самую проблему / результаты.
  3. Btw выше код написан в Котлине. Но я думаю, что это не причина этой проблемы.

Любое предложение о том, как правильно отображать данные в качестве FirebaseQuery указано в ref ?

Оказывается, я неправильно реализовал 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 } 

К сожалению, startAt() в Firebase не является startWith() , поэтому вместо того, чтобы возвращать beef & bean при startWith() bee , он возвращает каждый узел , начиная с name = bee (точно «bee»), до последнего узла (if вы не указываете endAt() .

Если он не найдет bee он вернет все узлы.

Если вы хотите использовать что-то вроде startWith() , к сожалению, Firebase по-прежнему не поддерживает такой запрос.

Однако есть библиотека под названием QueryBase, которая может помочь в вашем случае. это также написано пожарным. (Только JS)

Это может помочь вам, а также Android – Firebase query startAt не работает должным образом