Firebase和Android:订单查询结果

时间:2017-06-19 21:27:29

标签: android firebase firebase-realtime-database android-recyclerview

我对我的代码有一个简短的问题。

我在Android应用中使用了recyclerview,并在我的Firebase数据库中填写了一些数据。

效果很好,但我注意到排序不对:/

我有这个代码:

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

行分数包含一个整数,其数据范围为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);

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

创建回收站视图时使用此选项

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

答案 1 :(得分:0)

如果您将值存储为字符串,则它们将按字典顺序排序。要获得所需订单,请将它们存储为数字或将它们存储在一个字符串中,该字符串也按您想要的顺序排序。 E.g。

"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的日期,因为这可以确保它们以正确的方式排序日期(即使类型是字符串)。

请注意,由于您的后端系统限制,我建议您这样做。在大多数情况下,您只需将数字存储为数字并阻止此解决方法。

请参阅: