2017-06-19 70 views
0

我有我的代碼很短的問題。火力地堡和Android:查詢結果進行排序

我用我的Android應用程序recyclerview,並與一些數據我的火力地堡數據庫的填充。

它運作良好,但我注意到,該排序是不正確的:/

我有這樣的代碼:

private void getRankings() { 
     // hole anzahl an Teilnehmern 
     mDatabase.child(TEILNEHMERDATA).addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       // hole Anzahl aller Teilnehmer um das Ranking zu bestimmen 
       teilnehmerVar = (int) dataSnapshot.getChildrenCount(); 
       mDatabase.child(TEILNEHMERDATA).orderByChild("score").addChildEventListener(new ChildEventListener() { 
        Teilnehmer teilnehmer = new Teilnehmer(); 
        int i = teilnehmerVar+1; 
        @Override 
        public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
         // teamname, Platzierung, Punkte 
         int punkteStand = (int) Double.parseDouble(String.valueOf(dataSnapshot.child("score").getValue())); 

         i -= 1; 
         this.teilnehmer = new Teilnehmer(dataSnapshot.getKey(), ((String) dataSnapshot.child("teamname").getValue()), "Platz " + i, punkteStand + " Punkte"); 
         teilnehmerList.add(0, this.teilnehmer);  // add to recyclerview: add(0, teilnehmer) gebe in desc aus von 0 zum n. eintrag 
         mAdapter.notifyDataSetChanged(); // save 
        } 

在該行:

mDatabase.child(TEILNEHMERDATA).orderByChild("score").addChildEventListener(new ChildEventListener() { 

訂購兒童按分數

我得到我的數據與結構是這樣的:

"Teilnehmer" : { 
    "user_0gPpHXzKqLd2xA" : { 
     "image" : "", 
     "score" : "0", 
     "startnummer" : "1", 
     "teamname" : "Andy Foo" 
    }, 

該行分數包含一個Datarange整數從0到∞

我的佈局是這樣的:

Teamname1 9 Punkte 
Platz 1 

Teamname2 0 Punkte 
Platz 2 

Teamname3 1000 Punkte 
Platz 3 

但它絕對是錯誤的:/

9比10000大 僅由第一號

1..2..3看來我的訂單查詢..

我Recyclerview初始化:

recyclerView.setHasFixedSize(true); 
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); 
recyclerView.setLayoutManager(mLayoutManager); 
recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL)); 
recyclerView.setItemAnimator(new DefaultItemAnimator()); 
recyclerView.setAdapter(mAdapter); 

誰能幫助我嗎?

+0

您是否嘗試過使用'orderByValue()'方法? –

+0

這是一個快速回復。是的,嘗試使用orderByValue()。startAt(「0」)。endAt(「99999999」)但不起作用(我沒有得到任何數據) – georf

+0

您是否嘗試過使用這行代碼:'mDatabase.child(TEILNEHMERDATA ).orderByChild(「score」)。addChildEventListener(new ChildEventListener(){'這行代碼:'mDatabase.child(TEILNEHMERDATA).child(userId).orderByChild(「score」)。addChildEventListener(new ChildEventListener(){' ?'userId'是在TEILNEHMERDATA節點下面看到的id –

回答

0

時,如果存儲值作爲字符串,他們會爲了字典序。要獲得通緝令,或者將它們存儲爲數字或將它們存儲在一個字符串,還承攬你想要的方式。例如。

"Teilnehmer" : { 
    "user_0gPpHXzKqLd2xA" : { 
     "image" : "", 
     "score" : "00000", 
     "startnummer" : "1", 
     "teamname" : "Andy Foo" 
    }, 
    "user_0gPpHXzKqLd2xB" : { 
     "image" : "", 
     "score" : "00123", 
     "startnummer" : "1", 
     "teamname" : "Andy Bar" 
    }, 

所以在上面的結構,當你訂購的score它仍然會結束整理根據數值了。這是一個常見的技巧,比如你會經常看到格式化爲2017-06-19日期,因爲這可以確保他們在正確的方式排序的日期(即使類型爲字符串)。

請注意,我只建議這樣做,因爲你的後端系統的限制。在大多數情況下,您應該簡單地將數字存儲爲數字並阻止此解決方法。

參見:

+0

好的,謝謝,是否有可能將服務器(雲功能)從字符串轉換爲int? 因此,我的後端將數據存儲爲字符串,並且任何Firebase雲代碼都將其轉換爲有效整數? – georf

0

使用此創建您的回收視圖

LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); 
layoutManager.setReverseLayout(true); 
layoutManager.setStackFromEnd(true); 
recyclerView.setLayoutManager(layoutManager) 
+0

我會試試:)謝謝 – georf

+0

請讓我知道 –

+0

所以: recyclerView.setHasFixedSize(true); RecyclerView.LayoutManager mLayoutManager =新LinearLayoutManager(getApplicationContext()); .............. 無法解決setReverseLayout:/ 我已經更新了我的第一個問題有更好的語法/標籤 – georf