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