gpt4 book ai didi

java - 即时更新 UI

转载 作者:行者123 更新时间:2023-12-02 10:38:21 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com