2017-06-30 18 views
0

因此,我想使FirebaseListAdapter顯示自動填充建議,因爲在用戶鍵入至少X(在我的情況下爲1)個字符之後。FirebaseListAdapter忽略orderByChild()和equalTo()

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>([email protected], 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" 

下面是對上述數據庫中的火力指數規則:

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

不管怎麼說,結果,在輸入> 1個字符後,不管字符是什麼,總是像這樣(按照這個順序)。

beef 
vegetable 
bean 

(我所說的「不管」的意思,當然包括每個以下字符串:「牛肉」,「蔬菜」,或「豆」(1個字在時間),甚至是無稽之談滿貫-the鍵盤組合,如「igiviibbi」)

PS裏有一些代碼,我修整縮短片段,如:

  1. 延遲到每個輸入後顯示的建議,以防止過度的呼叫。
  2. suggestionAdapter.cleanup()通話開始前在createNewSuggestionAutoComplete()

P.S.S其他細節創建它的一個新的實例。

  1. 我用MyModel,而不是一個單純的String的原因是因爲我想添加一些其他領域也是如此。
  2. 我試過startAt()以及上面代碼中的equalTo(),但它們都顯示完全相同的問題/結果。
  3. 以上代碼的Btw寫在Kotlin。但我認爲這不是造成這個問題的原因。

任何關於如何正確顯示數據的建議爲FirebaseQueryref中指定?

回答

0

原來我錯誤地實施了FirebaseListAdapter

我應該通過Query,而不是DatabaseReference,到FirebaseListAdapter最後一個參數。(編輯沒有發現錯誤,因爲DatabaseReferenceQuery繼承)

所以,它應該是:

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>([email protected], 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()startWith(),因此而不是回報beef & bean當您輸入bee時,它會返回每個節點,從名稱= bee(完全是「bee」)開始,直到最後一個節點(如果您未指定endAt()

如果它沒有找到任何bee它將返回所有節點。

如果您想使用類似startWith()的東西,不幸的是Firebase仍然不支持這種查詢。

但是,有一個名爲QueryBase的庫可能有助於您的情況。它也是由firebaser寫的。 (僅限JS)

這可能對你有幫助Android - Firebase query startAt not working as expected