Обновление размера списка для всех пользователей

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

Это инициализируется только на уровне класса? int gameSlot = openGames.size();

Pandey Amit 27.10.2018 06:15

Думаю, вам стоит использовать вот такой gameSlot = openGames.size();FirebaseDatabase.getInstance().getReference("FCGames").child‌​(Integer.toString(ga‌​meSlot)) .setValue(gameMaker).addOnCompleteListener...

Pandey Amit 27.10.2018 06:16

используйте .addListenerForSingleValueEvent (new ValueEventListener () ... вместо этого он также увеличит производительность. Тогда ваша проблема с синхронизацией решит

PushpikaWan 27.10.2018 06:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Привет, спасибо за эту информацию. Я меняю часть своего кода, так что, возможно, он будет работать лучше. Но у меня есть вопрос. Я знаю, как получить данные, которые уже находятся в базе данных, с помощью dataSnapshot, но как я могу обновить значение размера списка и отправить его в базу данных с помощью метода onDataChange?

CoderKlipto 27.10.2018 06:37

Привет, я только что обновил свой пост и добавил релевантный контент внизу. Не могли бы вы проверить, нахожусь ли я на пути записи?

CoderKlipto 27.10.2018 06:40

Насколько я понял, вам нужно обновить базу данных только один раз. Тогда вам не нужно добавлять этот процесс обновления в этот onDataChange. Вам нужно получить только последнее значение. Потом обновите и запихните.

PushpikaWan 27.10.2018 06:41

Итак, где мне обновить базу данных, указав самый последний размер списка ()? Это число будет постоянно меняться по мере добавления и удаления игр, поэтому я не совсем уверен, где я буду его обновлять.

CoderKlipto 27.10.2018 06:44

Я просто говорю, вам нужно только один раз обновить базу данных со стороны пользователя. Если пользователь удаляет из игры, вам нужно обновить его только на стороне пользователя (только на устройстве), вам не нужно отправлять какие-либо данные в базу данных. Вот почему я это сказал. U обновить данные приложения ur внутри этого метода onDataChange

PushpikaWan 27.10.2018 06:48

Другие вопросы по теме