Как переключаться между узлами Firebase?

419
12 мая 2017, 14:59

Здравствуйте. Нужна помощь. Как переключаться между узлами в 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;
}

} введите сюда описание изображения

Answer 1

Вам нужно в колбэке изменения даты менять не только ссылку на ноду в БД, но и убрать все данные из их списка, уведомить адаптер о изменениях данных, и назначить новый слушатель изменения данных.

По хорошему, при изменении ссылки на ноду, надо бы ещё и убрать со старой слушатели.

Т.е., в конце слушателя изменения даты, вместо reference = database.getReference(selectedDate); надо так:

result.clear();
adapter.notifyDataSetChanged();
reference.removeChangeListeners();
reference = database.getReference(selectedDate);
updateList();
READ ALSO
Наследование внутренних классов в java

Наследование внутренних классов в java

Объясните кто может, как происходит наследование вложенных non-static классовНа примере следующего кода:

245
Лагает при скролле RecyclerView

Лагает при скролле RecyclerView

Вообщем проблема такая, есть TabLayout и ViewPager, всего вкладок у меня 5, на первых двух вкладках идет RecyclerView с данными, а на 3 избранные, по началу...

350
GMP4J на андроиде с помощью ndk

GMP4J на андроиде с помощью ndk

Нашел проект который создает подобие javamath

199