java - 即时更新 UI

标签 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);

希望得到一些帮助!

最佳答案

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

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

    }

关于java - 即时更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53109655/

相关文章:

Android Room Paging3 动态过滤的正确方法

android - 如何将 `rememberNavController` 从喷气背包组合成使用刀柄的 Activity ?

firebase - 项目已链接但未导出数据

firebase - Dart Firebase Firestore Atomic注册

javascript - 如何使用 Vue.js Firebase UID 删除用户

java - 从url中获取域名

java - 如何在Java中读写没有某些节点的XML文件

java - 我无法暂停并继续 CountDownTimer

java - 类文件使用导入但报告 Unresolved 编译问题

java - 这是一个有效的 SQLite 查询吗