2017-04-10 6 views
0

Ich habe den Code gefunden, der durch meine Liste der Bestenliste läuft und gibt den entsprechenden Wert zurück. Aber ich müsste die Position des Artikels in der Liste zurückgeben. Wie sollte ich den Code ändern, damit er die Position (Index) des Elements zurückgibt?Holen Sie sich die Position des Artikels von Firebase

Danke.

//query for sorting by score 
    score = FirebaseDatabase.getInstance().getReference().child("Leaders"); 
    final Query query = score.orderByChild("uID").equalTo(mCurrentUser.getUid()); 

    query.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      Iterator<DataSnapshot> iterator = dataSnapshot.getChildren().iterator(); 

      int length = (int) dataSnapshot.getChildrenCount(); 

      String[] sampleString = new String[length]; 

      while(i < length) { 
       sampleString[i] = iterator.next().getValue().toString(); 
       //Log.d(Integer.toString(i), sampleString[i]); 

       //print the value of current score 
       Toast.makeText(LeaderBoardActivity.this,sampleString[i],Toast.LENGTH_LONG).show(); 
       i++; 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

enter image description here

+0

Versuchen Sie 'FirebaseListAdapter' zu verwenden, wie in einer vorherigen Antwort erwähnt. Wird sicher funktionieren. Die 'populateView()' Methode hat genau das, was Sie brauchen, die 'Position'. –

Antwort

1

Ich habe das auf Ihre Kommentare basierten Code bearbeitet. Da Sie nur die Position und Punktzahl interessieren ...

// you will need to query the database based on scores 
score = FirebaseDatabase.getInstance().getReference().child("Leaders"); 
final Query query = score.orderByChild("Score"); 
query.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     // get total leaders. Let's say total leader is 5 persons 
     int total = (int) dataSnapshot.getChildrenCount(); 
     // let's say userB is actually 2nd in the list 
     int i = 0; 
     // loop through dataSnapshot 
     for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) { 
      String uID = childSnapshot.child("uID").getValue(); 
      if (uID.equals(mCurrentUser.getUid()) { 
       // the list is ascending, when finally reach userB, i = 3 
       int userPlace = total - i; // gives 2 
       int score = childSnapshot.child("Score").getValue(Interger.class); 
       break; 
      } else { 
       i++; 
      } 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 

Beachten Sie, dass dies sehr viel Bandbreite verbrauchen kann. Wenn Sie mehr und mehr Benutzer erhalten, müssen Sie alle Benutzerdaten für jede Abfrage herunterladen. Es könnte besser sein, wenn Sie nur die Top 5 Führer usw. zeigen.

+0

was ich versuche zu tun ist im Grunde die Position auf der Rangliste. Beispiel: Benutzer A hat 80 Punkte, Benutzer B hat 60. Die Position wird also wie folgt festgelegt: Benutzer A Erster Benutzer B 2 usw. – MariusBrave

+0

Wie wollen Sie die Werte aus der Liste abrufen? Bitte geben Sie ein Beispiel für die Liste. Müssen Sie den Benutzernamen in die Liste aufnehmen? Ist es "(1) Benutzer A - 80 (2) Benutzer B - 60 (3) Benutzer C ....' oder Sie interessieren sich nicht wirklich für die Sequenz und wollen einfach '(Benutzer A) - 80, (Benutzer B) - 60, (Benutzer C) ... 'Das Element in der Klammer ist der" Schlüssel ", um die Werte in der Liste später zurückzurufen. – tingyik90

+0

Ich sorge mich über die Reihenfolge, das ist die Hauptidee der Rangliste, um zu zeigen, in welcher Position der Benutzer ist. Ich muss seinen Namen nicht wirklich zeigen ... muss nur den Wert der Punktzahl und den Indexwert von zeigen it – MariusBrave

Verwandte Themen