首页 > 解决方案 > 无法在 RecyclerView 中显示来自 dataSnapshot 的值

问题描述

我正在使用 aRecyclerView来展示我dataSnapshot的结果,但无法正确显示结果。以前我的 JSON 树的结构是 gameTimes > user_id > game > results,但现在 json 树已缩短为 gameTimes > game > results,以便更容易找到用户名。

我有我dataSnapshot的内心GameInfoHoldersetGameInfo方法。这在实践中可能不是最好的方法,但在 JSON 树更改之前,结果会起作用,但分数的用户名没有显示在结果旁边。不是我根本没有任何结果。下面我包含了一段数据来显示我的问题。

我已经包含了我的 JSON 树的结构以供参考。

RecyclerView recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

rootRef = FirebaseDatabase.getInstance().getReference();

DatabaseReference hiscoreRef = rootRef.child("gameTimes").child(userID).child("game");
        Query hiscoreQuery = hiscoreRef.orderByChild("gameTime").limitToLast(10);

FirebaseRecyclerOptions<GameInfo> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<GameInfo>()
                .setQuery(hiscoreQuery, GameInfo.class)
                .build();

 firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<GameInfo, GameInfoHolder>(firebaseRecyclerOptions) {
            @Override
            protected void onBindViewHolder(@NonNull GameInfoHolder gameInfoHolder, int i, @NonNull GameInfo gameInfo) {
                gameInfoHolder.setGameInfo(gameInfo);
            }

            @NonNull
            @Override
            public GameInfoHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.firebase_item_file, parent, false);

                return new GameInfoHolder(view);
            }
        };
        recyclerView.setAdapter(firebaseRecyclerAdapter);

private class GameInfoHolder extends RecyclerView.ViewHolder {
    private TextView score1;
    private TextView namename1;

    GameInfoHolder(View itemView) {
        super(itemView);
        score1 = itemView.findViewById(R.id.score1);
        name1 = itemView.findViewById(R.id.name1);

    }

    void setGameInfo(GameInfo gameInfo) {

        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference hiscoreRef = rootRef.child("gameTimes").child("game");
        Query hiscoreQuery = hiscoreRef.orderByChild("gameTime").limitToFirst(10);
        hiscoreQuery.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot){
                int hiscore = 0;
                String uName = "";
                for (DataSnapshot ds: dataSnapshot.getChildren()) {
                    hiscore = ds.child("gameTime").getValue(Integer.class);
                    uName = ds.child("username").getValue(String.class);
                }
                Log.d("TAG", String.valueOf(hiscore));
                String mScore1 = df.format(hiscore / 1000.0);
                score1.setText(mScore1);
                String mName1 = uName;
                name1.setText(mName1);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                throw databaseError.toException(); // never ignore errors
            }

        });
    }
 }

{
  "gameTimes" : {
    "game" : {
      "-LoHuG5ZY_e0Gzs3Phkh" : {
        "game_bank" : 0,
        "game_count" : 3,
        "gameTime" : 7194,
        "user_id" : "kzqG0GBns0bGLQdPeV70pO1k4BB2",
        "username" : "DataBoi"
      },
      "-LoHuMQFK7z2nN3kFb3F" : {
        "game_bank" : 0,
        "game_count" : 2,
        "gameTime" : 11784,
        "user_id" : "kzqG0GBns0bGLQdPeV70pO1k4BB2",
        "username" : "DataBoi"
      },
      "-LoHvWG32slt1hCXzaei" : {
        "game_bank" : 0,
        "game_count" : 3,
        "gameTime" : 20072,
        "user_id" : "kzqG0GBns0bGLQdPeV70pO1k4BB2",
        "username" : "DataBoi"
      },
      "-LoHvWHjhZJ3fqkbWmjy" : {
        "game_bank" : 0,
        "game_count" : 3,
        "gameTime" : 20072,
        "user_id" : "kzqG0GBns0bGLQdPeV70pO1k4BB2",
        "username" : "DataBoi"
      },
      "-LoHxnIM7KDce1rxr1MD" : {
        "game_bank" : 0,
        "game_count" : 2,
        "gameTime" : 11470,
        "user_id" : "T9psJTZhapPvXFuzo5NZ6bHG6xo1",
        "username" : "DataMan"
      }
    }
  },
  "userDetails" : {
    "T9psJTZhapPvXFuzo5NZ6bHG6xo1" : {
      "username" : "DataMan"
    },
    "kzqG0GBns0bGLQdPeV70pO1k4BB2" : {
      "username" : "DataBoi"
    }
  },
  "userInfo" : {
    "DataBoi" : {
      "kzqG0GBns0bGLQdPeV70pO1k4BB2" : {
        "date_of_birth" : "08/08/2018",
        "education" : "Master's",
        "exercise" : "1 - 2 Hours a Week",
        "forename" : "Data",
        "gender" : "Male",
        "surname" : "Boi",
        "username" : "DataBoi"
      }
    },
    "DataMan" : {
      "T9psJTZhapPvXFuzo5NZ6bHG6xo1" : {
        "date_of_birth" : "01/01/1019",
        "education" : "Yes",
        "exercise" : "10 Hours or more a Week",
        "forename" : "Data",
        "gender" : "Male",
        "surname" : "Man",
        "username" : "DataMan"
      }
    }
  }
}

我的预期结果将是记分板打开并在右侧查看前十个最佳游戏时间的数据快照以及左侧旁边的适当用户名(属于该痛处)。回收站视图为这些视图设置得很好。问题只是得到结果。我的 JSON 结构有问题吗?

标签: javaandroidfirebase-realtime-database

解决方案


推荐阅读