Обновление размера списка для всех пользователей - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь сделать так, чтобы, когда пользователь создает открытую игру, в моей базе данных 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 голосов
/ 27 октября 2018

В следующем фрагменте кода вы сделали это openGames.add (имя пользователя) в слушателе onDataChange. Я думаю, что это неправильное использование этой функции ondatachange

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

пожалуйста, используйте это, чтобы получить данные из базы данных и обновить ваши данные. Затем нажмите ваши данные в БД. Вы также не использовали значение снимка. Вы можете получить последние обновленные данные из dataSnapshot. Используйте его для обновления пользовательских данных, затем нажмите на db

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...