2017-06-19 44 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