我正在尝试做到这一点,以便当用户创建开放游戏时,在我的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,它创建一个在按下按钮时调用该方法的
答案 0 :(得分:0)
在下面的代码段中,您在onDataChange侦听器中完成了openGames.add(username)。我认为此ondatachange函数的使用不正确
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
openGames.add(userName);
adapter.notifyDataSetChanged();
}
请使用它从db获取数据并更新您的数据。然后将数据推送到db。您也没有使用快照值。您可以从dataSnapshot
获取最近更新的数据。用它来更新用户数据,然后将其推送到数据库