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