У меня есть игровое лобби, которое добавляет кнопку присоединения к экрану, когда кто-то создает игру. Кнопка добавлена, но она не появится, пока вы не покинете и не вернетесь на страницу. Это код, который добавляет кнопку, и он должен обновлять 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) {
}
});
}
Так что это работает правильно, но все равно не обновляет интерфейс сразу. Должно быть, я сделал что-то не так. Может кто-нибудь найти ошибку, которую я сделал?
Кроме того, я пытаюсь вызвать свой openGames ArrayList в другом месте, в экземпляре RecyclerView, но не могу понять, как именно вызвать его, когда я не делаю переменную глобальной.
Этот экземпляр находится в моем onCreateMethod (), и я не уверен, что поставить вместо 'openGames'
adapter = new MyRecyclerViewAdapter(this, openGames);
Надеясь получить помощь!