2017-04-10 6 views
0

私はリーダーボードの私のリストを実行し、対応する値を返すコードを見つけました。しかし、私はリストの項目の位置を返す必要があります。アイテムの位置(インデックス)を返すようにコードを修正する方法を教えてください。Firebaseからのアイテムの位置を取得

ありがとうございました。

//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

前の回答のように 'FirebaseListAdapter'を使ってみてください。確かに働くでしょう。 'populateView()'メソッドは、あなたが必要とする、正確に 'position'を持っています。 –

答えて

1

私はあなたのコメントに基づいてコードを編集しました。あなたはその位置とスコアだけを気にするので...

// 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) { 

    } 
}); 

これは非常に帯域幅を消費する可能性があることに注意してください。より多くのユーザーが増えれば、各クエリのすべてのユーザーデータをダウンロードする必要があります。上位5人の指導者などを見せてもらえればいいかもしれません。

+0

私は何をしようとしているのは、基本的にリーダーボード上の位置を提供しています。例えば、ユーザAは80、ポイントBは60である。したがって、このユーザAの第1ユーザBのように配置される。 – MariusBrave

+0

リストから値をどのように取得するのですか?リストの例を挙げてください。リストにユーザー名を含める必要がありますか? (1)User A - 80(2)User B - 60(3)User C .... 'であるか、シーケンスを本当に気にせず、'(User A) - 80、 (ユーザーB) - 60、(ユーザーC)... '括弧内の項目は、後でリストの値をコールバックする「キー」です。 – tingyik90

+0

私はシーケンスを気にします。それは、ユーザーがどのポジションにいるのかを示すリーダーボードの主なアイデアです。私は本当に彼の名前を表示する必要はありません...スコアの値とインデックス値を表示する必要がありますそれは – MariusBrave

関連する問題