Android 从Firebase获取物品的位置

Android 从Firebase获取物品的位置,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我找到了通过我的leader board列表运行的代码,并返回了相应的值。但是我需要返回项目在列表中的位置。我应该如何修改代码,使其返回项目的位置(索引) 谢谢 //query for sorting by score score = FirebaseDatabase.getInstance().getReference().child("Leaders"); final Query query = score.orderByChild("uID").equalTo(mCurre

我找到了通过我的leader board列表运行的代码,并返回了相应的值。但是我需要返回项目在列表中的位置。我应该如何修改代码,使其返回项目的位置(索引)

谢谢

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

        }
    });
//按分数排序的查询
score=FirebaseDatabase.getInstance().getReference().child(“领导者”);
最终查询Query=score.orderByChild(“uID”).equalTo(mCurrentUser.getUid());
addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
迭代器迭代器=dataSnapshot.getChildren().Iterator();
int length=(int)dataSnapshot.getChildrenCount();
String[]sampleString=新字符串[长度];
while(i

我已经根据您的评论编辑了代码。因为你只关心位置和得分

// 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名领导者等,可能会更好。

我使用以下方法按位置更改子值,希望这能给您一些帮助:

DataSnapshot targetData;

@Override
protected void onStart() {
    super.onStart();

    targetReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshots) {
            targetData = dataSnapshots;        //save in global variable
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
        }
    });
}

private void yourMethod() {
    int index = 0;

    for (DataSnapshot childSnapshot : targetData.getChildren()) {
        if (index == 1) {        //your target index
            DatabaseReference currentReference = childSnapshot.getRef();

            currentReference.setValue("xxx");
        }

        index++;
    }
}

尝试使用前面答案中提到的
FirebaseListAdapter
。肯定会有用的。
populateView()
方法具有您所需的确切信息,即
位置
。我试图做的基本上是在领导板上提供位置。例如,用户A有80分,用户B有60分。因此,这个位置将像这个用户A第一个用户B第二个用户一样排列。您打算如何从列表中检索值?请举一个清单的例子。您需要在列表中包含用户名吗?是
(1)用户A-80(2)用户B-60(3)用户C…
还是您并不真正关心序列,只想
(用户A)-80,(用户B)-60,(用户C)…
括号中的项目是稍后调用列表中的值的“键”。我关心序列,这是leader board显示用户所处位置的主要思想。我真的不需要显示他的名字…只需要显示分数的值和它的索引值,但是你的查询似乎只返回1个用户的分数?您使用的是
.equalTo(mCurrentUser.getUid())
,因此它将只返回该特定用户的分数。是的,这是正确的…因为我想知道当前用户处于哪个位置。