Мгновенное обновление интерфейса - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть игровое лобби, которое добавляет кнопку присоединения к экрану, когда кто-то создает игру. Кнопка добавлена, но она не появится, пока вы не покинете и не вернетесь на страницу. Это код, который добавляет кнопку, и он должен обновлять RecyclerView, в котором хранится кнопка.

    FCGames.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            numGames = (int) dataSnapshot.getChildrenCount();

               for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    gm = ds.getValue(GameMaker.class);
                    openGames.add(gm.getUser1().getUserName());
                }

            adapter.notifyDataSetChanged();

        }

Так что я думаю, что проблема с

adapter.notifyDataSetChanged ()

Но я не совсем уверен. Я добавил этот фрагмент кода в цикл for, но это тоже ничего не изменило.

После дальнейшего изучения я понял, что список openGames, который просто определяется в верхней части класса как

ArrayList<String> openGames = new ArrayList<>();

Не обновляется, пока вы не обновите страницу

Любой совет?


Я просмотрел некоторые вещи, которые сказал @Puff, и добавил это в мой код. Я изменил свое заявление слушателя на это

        FCGames.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                updateUI(new ListCallback() {
                        @Override
                        public void onCallback(List<String> value) {
                            Toast.makeText(FlipCoinLobby.this, "it worked", Toast.LENGTH_SHORT).show();
                        }
                    });
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

И добавил это как мой обратный вызов.

    public interface ListCallback {
    void onCallback(List<String> value);
}

А потом я создал это заявление для обновления моего пользовательского интерфейса.

    public void updateUI(final ListCallback callBack) {
    FCGames.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            numGames = (int) dataSnapshot.getChildrenCount();

            ArrayList<String> openGames = new ArrayList<>();

            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                gm = ds.getValue(GameMaker.class);
                openGames.add(gm.getUser1().getUserName());
            }

            callBack.onCallback(openGames);

            adapter.notifyDataSetChanged();

        }

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

        }
    });
}

Так что это работает правильно, но все равно не обновляет интерфейс сразу. Должно быть, я сделал что-то не так. Может кто-нибудь найти ошибку, которую я сделал?

Кроме того, я пытаюсь вызвать свой openGames ArrayList в другом месте, в экземпляре RecyclerView, но не могу понять, как именно вызвать его, когда я не делаю переменную глобальной.

Этот экземпляр находится в моем onCreateMethod (), и я не уверен, что поставить вместо 'openGames'

adapter = new MyRecyclerViewAdapter(this, openGames);

Надеясь получить помощь!

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Это то, что я сделал, чтобы обновить сватовство, когда пользователь еще не подключен к ROOM:

  Matchmaking.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                //nel caso ci siano delle modifiche alla tabella
                //se il match non � stato trovato e Account � stato verificato
                if(accountFound){
                    //azzero la Lista
                    List_party = new ArrayList<>();
                    Id_rooms = new ArrayList<>();
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    //sempre se matchfound non � stato trovato
                    if (!currentwithID.getMatch_found()) {
                        //prendo la quantit� di figli presenti
                        size = Integer.parseInt(String.valueOf(dataSnapshot.getChildrenCount()));
                        //inserisco all'interno della variabile CT il valore di ogni figlio
                        ct = ds.getValue(Class_party.class);
                        // e se � il numero di giocatori == 1 e la partita non � iniziata e finita in modo anomalo
                        if (ct.getNumberOfPlayers() == 1 && !ct.getStart() && ct.getCorrect_end() && ct.getAccessible()) {
                            //aggiungo l'id della room alla lista
                            //Inserisco alla list_party l'intero oggetto
                            Id_rooms.add(ct.getId());
                            List_party.add(ct);
                        }

                        Toast.makeText(HomeActivity.this, "Room List Updated", Toast.LENGTH_SHORT).show();
                    }
                }
                }
            }

Надеюсь, это поможет: D

0 голосов
/ 02 ноября 2018

Объявите список Array внутри слушателя, как показано ниже

FCGames.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        numGames = (int) dataSnapshot.getChildrenCount();
          ArrayList<String> openGames = new ArrayList<>();

           for(DataSnapshot ds : dataSnapshot.getChildren()) {
                gm = ds.getValue(GameMaker.class);
                openGames.add(gm.getUser1().getUserName());
            }
             //Pass the object to a method in your program to update UI.
            updateUi(openGames);
           //Reload the adapter!


        adapter.notifyDataSetChanged();

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