为所有用户更新列表大小

时间:2018-10-27 04:09:57

标签: java android list firebase firebase-realtime-database

我正在尝试做到这一点,以便当用户创建开放游戏时,在我的Firebase数据库中,游戏名称就是列表的大小。因此,第一个创建该游戏的游戏的名称将为0,如果另一个用户创建了游戏,则该游戏将被标记为1,依此类推。

我现在已经设置好了,以便将游戏标记为游戏列表的大小,但是列表并没有真正更新。游戏一直被称为“ 0”,因为它认为列表是空的,即使我在应用程序中目视确认已将项目添加到列表中。

所以我的问题是:我怎样才能使列表在每次添加游戏时都不断更新?我如何才能使列表对所有用户(而不仅仅是创建游戏的用户)进行更新?

这是我现在设置的内容。这是我用于列表的变量和获取列表大小的整数

ArrayList<String> openGames = new ArrayList<>();
int gameSlot = openGames.size();

这是我在创建游戏时使用的名字。

gameMaker = new GameMaker(hp.uid, userName, wagerD, gameSlot);

FirebaseDatabase.getInstance().getReference("FCGames").child(Integer.toString(gameSlot))
        .setValue(gameMaker).addOnCompleteListener...

这就是我必须将游戏添加到列表中的原因。

cgRef.child(Integer.toString(gameSlot)).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            openGames.add(userName);
            adapter.notifyDataSetChanged();
        }

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

再次,我的问题是如何使该列表正确更新,以及如何为该应用程序上的所有用户更新该列表?


编辑

这是我对onChangeData所做的

    cgRef.child(Integer.toString(gameSlot)).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            wager = (String) dataSnapshot.child("wager").getValue();
            gameSlot = openGames.size();
            adapter.notifyDataSetChanged();
        }

现在,openGames.add位于我的createGameLobby方法中。

        FirebaseDatabase.getInstance().getReference("FCGames").child(Integer.toString(gameSlot))
            .setValue(gameMaker).addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    openGames.add(userName);
                Toast.makeText(FlipCoinLobby.this, "Game creation successful.", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(FlipCoinLobby.this, task.getException().getMessage(), Toast.LENGTH_SHORT).show();
            }
        }
    });

^^仅仅是该方法的重要片段。然后我有一个onClickListener,它创建一个在按下按钮时调用该方法的

1 个答案:

答案 0 :(得分:0)

在下面的代码段中,您在onDataChange侦听器中完成了openGames.add(username)。我认为此ondatachange函数的使用不正确

@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    openGames.add(userName);
    adapter.notifyDataSetChanged();
}

请使用它从db获取数据并更新您的数据。然后将数据推送到db。您也没有使用快照值。您可以从dataSnapshot获取最近更新的数据。用它来更新用户数据,然后将其推送到数据库