Здравствуйте. Нужна помощь. Как переключаться между узлами в Firebase? Есть календарь, на определенную дату свой узел в бд. Текущий список отображает без проблем. Но когда выбираю другую дату список не обновляется. Помогите, как это реализовать?
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private List<UserModel> result;
private UserAdapter adapter;
CalendarView calendarView;
String selectedDate;
private FirebaseDatabase database;
private DatabaseReference reference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_email_password);
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("dd_MM_yyyy");
Date date = new Date();
calendarView = (CalendarView) findViewById(R.id.calendarView);
selectedDate = sdf.format(date);
try {
calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
@Override
public void onSelectedDayChange(@NonNull CalendarView calendarView, int year, int month, int dayOfMonth) {
int mYear = year;
int mMonth = month;
int mDay = dayOfMonth;
selectedDate = new StringBuilder().append(mDay).append("_").append(mMonth + 1).append("_")
.append(mYear).toString();
Toast.makeText(MainActivity.this, selectedDate, Toast.LENGTH_SHORT).show();
reference = database.getReference(selectedDate);
}
});
database = FirebaseDatabase.getInstance();
reference = database.getReference(selectedDate);
result = new ArrayList<>();
recyclerView = (RecyclerView) findViewById(R.id.userList);
recyclerView.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayout.VERTICAL);
recyclerView.setLayoutManager(llm);
adapter = new UserAdapter(result);
recyclerView.setAdapter(adapter);
updateList();
} catch (NullPointerException e) {
}
}
private void updateList() {
reference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
// result.clear();
result.add(dataSnapshot.getValue(UserModel.class));
adapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
UserModel model = dataSnapshot.getValue(UserModel.class);
int index = getItemIndex(model);
result.set(index, model);
adapter.notifyItemChanged(index);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
UserModel model = dataSnapshot.getValue(UserModel.class);
int index = getItemIndex(model);
result.remove(index);
adapter.notifyItemRemoved(index);
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private int getItemIndex(UserModel user) {
int index = -1;
for (int i = 0; i < result.size(); i++) {
if (result.get(i).key.equals(user.key))
index = i;
break;
}
return index;
}
} введите сюда описание изображения
Вам нужно в колбэке изменения даты менять не только ссылку на ноду в БД, но и убрать все данные из их списка, уведомить адаптер о изменениях данных, и назначить новый слушатель изменения данных.
По хорошему, при изменении ссылки на ноду, надо бы ещё и убрать со старой слушатели.
Т.е., в конце слушателя изменения даты, вместо reference = database.getReference(selectedDate);
надо так:
result.clear();
adapter.notifyDataSetChanged();
reference.removeChangeListeners();
reference = database.getReference(selectedDate);
updateList();
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Объясните кто может, как происходит наследование вложенных non-static классовНа примере следующего кода:
У меня есть такой запрос:
Вообщем проблема такая, есть TabLayout и ViewPager, всего вкладок у меня 5, на первых двух вкладках идет RecyclerView с данными, а на 3 избранные, по началу...