即时更新用户界面

时间:2018-11-01 21:32:55

标签: java android firebase firebase-realtime-database

我有一个游戏大厅,当有人创建游戏时,该大厅会在屏幕上添加一个加入按钮。该按钮已添加,但直到您离开并重新进入页面才显示。这是添加按钮的代码,应该更新存储按钮的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) {

        }
    });
}

这样可以正常运行,但是仍然不能立即更新UI。我一定做错了。谁能找到我犯的错误?

此外,我试图在RecyclerView实例中的其他地方调用openGames ArrayList,但是当我不将该变量设置为全局变量时,无法确切地知道如何调用它。

该实例在我的onCreateMethod()中,我不确定用什么代替“ openGames”

adapter = new MyRecyclerViewAdapter(this, openGames);

希望获得帮助!

2 个答案:

答案 0 :(得分:1)

在侦听器中声明如下数组列表

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();

    }

答案 1 :(得分:0)

这是我在用户尚未连接到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

相关问题