Слушатель событий обновляет экран только одного пользователя

Поэтому я пытаюсь сделать так, чтобы, когда пользователь создает открытую игру в игровом лобби, его имя пользователя и кнопка «присоединиться» появлялись на экране лобби. Он работает прямо сейчас, но проблема в том, что он появляется только для пользователя, который создал игру, он не будет отображаться для любого другого пользователя, если другой пользователь тоже не создаст игру, тогда появятся обе открытые игры, но это не так. обновление в реальном времени.

У меня так устроено, что когда пользователь создает игру, игра и некоторые относящиеся к игре вариации добавляются в базу данных в реальном времени. И прямо сейчас у меня есть прослушиватель событий, показанный ниже, который проверяет, обновляется ли игровой узел, и когда он обновляется, он должен обновлять пользовательский интерфейс, но он делает это только для пользователя, создавшего игру.

    final RecyclerView recyclerView = findViewById(R.id.rvfcGames);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    final ArrayList<String> openGames = new ArrayList<>();
    adapter = new MyRecyclerViewAdapter(this, openGames);
    adapter.setClickListener(this);
    recyclerView.setAdapter(adapter);


  DatabaseReference cgRef = database.getReference("FCGames");
    cgRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            openGames.add("username");
        }

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

Этот фрагмент работает, потому что всякий раз, когда пользователь создает игру, он добавляется в список, но я не уверен, как сделать так, чтобы он обновлял пользовательский интерфейс в реальном времени для каждого пользователя, использующего приложение.

Итак, что мне делать, чтобы обновлять экран каждого пользователя в реальном времени, когда они находятся в холле?

0
0
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это снова я. Хотел бы спросить, куда вы добавили свой addValueEventListener?

Подтверждает, что все плееры слушают cgRef. Это приводит к тому, что все их onDataChange() вызываются, если какое-либо поле cgRef было изменено.

Например :

// For all players, listen to the ref in onCreate() of an Activity.
    onCreate(...){
            ...
            cgRef.addValueEventListener(new ValueEventListener() {
                // update UI in onDataChange()
                // maybe you wand to update your list then adapter.notifyDatasetChanged()
            }
    }

// For creator, write the game's data when the game created.
    createGame(...){
        cgRef.child("someName").setValue(someData);
    }

После обновления cgRef. Все, у кого был addValueEventListener(), должны получить обновление.

И снова здравствуйте! У меня есть addValueEventListener в моем методе onCreate. И у меня есть setClickListener в методе onCreate, где cgRef.child ... setValue (someData); выполняется. Как я могу убедиться, что все пользователи слушают cgRef?

CoderKlipto 26.10.2018 07:22

Эй, на самом деле я только что добавил адаптер .notifyDatasetChanged (), и это полностью устранило проблему !! Вы можете объяснить, что сделала эта строчка?

CoderKlipto 26.10.2018 07:26

Ага, значит проблема в вашем recyclerView, а не в firebase. Если вы обновляете какие-либо данные в списке, вы должны уведомить его, позвонив в notifyDatasetChanged(), чтобы он знал, что ему нужно обновить свой контент.

Wesely 26.10.2018 07:31

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