Ошибка заполнения RecyclerView

207
11 июня 2018, 14:00

Из приложения заполняю данные на сервер Firebase, и тут же отображаю их в RecyclerView, по при первом запуске когда происходит запись на сервер в RecyclerView намного больше пунктов чем должно быть, на сервере их нет, они являются клонами друг друга. Вот код:

reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot.child(userId).exists()){
                   reference.child(userId).child("KEYS").addChildEventListener(new ChildEventListener() {
                       @Override
                       public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                           codes.add(dataSnapshot.getValue(Codes.class));
                           codesAdapter.notifyDataSetChanged();
                       }
                       @Override
                       public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                           Codes code = dataSnapshot.getValue(Codes.class);
                           int index = getItemIndex(code);
                           codes.set(index, code);
                           codesAdapter.notifyItemChanged(index);
                       }
                       @Override
                       public void onChildRemoved(DataSnapshot dataSnapshot) {
                           Codes code = dataSnapshot.getValue(Codes.class);
                           int index = getItemIndex(code);
                           codes.remove(index);
                           codesAdapter.notifyItemRemoved(index);
                       }
                       @Override
                       public void onChildMoved(DataSnapshot dataSnapshot, String s) {
                       }
                       @Override
                       public void onCancelled(DatabaseError databaseError) {
                       }
                    });
            }else{
                if(newArr.contains("newArr")) {
                    reference.child(userId).child("Тут не пусто").setValue("Да да это правда");
                    for (int k = 1; k < 4; k++) {
                        String cod = "G-" + (k + (k * 3)) * 5553;
                        reference.child(userId).child("KEYS").child(cod).child("cod").setValue(cod);
                    }
                    SharedPreferences.Editor editor = newArr.edit();
                    editor.putString("newArr","false");
                    editor.apply();
                }
            }
        }
        @Override public void onCancelled(DatabaseError databaseError) { }
    });
Answer 1

Решил вопрос выносом функции получения данных:

  reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(!dataSnapshot.child(userId).exists()){
                    reference.child(userId).child("Тут не пусто").setValue("Да да это правда");
                    for (int k = 1; k < 4; k++) {
                        String cod = "G-" + (k + (k * 3)) * 5553;
                        reference.child(userId).child("KEYS").child(cod).child("cod").setValue(cod);

                }
            }
        }
        @Override public void onCancelled(DatabaseError databaseError) { }
    });
reference.child(userId).child("KEYS").addChildEventListener(new ChildEventListener() {
                       @Override
                       public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                           codes.add(dataSnapshot.getValue(Codes.class));
                           codesAdapter.notifyDataSetChanged();
                       }
                       @Override
                       public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                           Codes code = dataSnapshot.getValue(Codes.class);
                           int index = getItemIndex(code);
                           codes.set(index, code);
                           codesAdapter.notifyItemChanged(index);
                       }
                       @Override
                       public void onChildRemoved(DataSnapshot dataSnapshot) {
                           Codes code = dataSnapshot.getValue(Codes.class);
                           int index = getItemIndex(code);
                           codes.remove(index);
                           codesAdapter.notifyItemRemoved(index);
                       }
                       @Override
                       public void onChildMoved(DataSnapshot dataSnapshot, String s) {
                       }
                       @Override
                       public void onCancelled(DatabaseError databaseError) {
                       }
                    });
READ ALSO
Бэкап MySQL базы через Java приложение

Бэкап MySQL базы через Java приложение

Делаю бэкапы базы данный MySQL в Java приложенииВот код:

178
Автозамена атрибута в теге с помощью редактора кода

Автозамена атрибута в теге с помощью редактора кода

Хочу заменить в тегах <img> все атрибуты src на data-src, по всему проекту, но чтобы не затрагивались теги script, js-код и тп

193
Создание ячеек для игры &ldquo;Сапер&rdquo; на javascript

Создание ячеек для игры “Сапер” на javascript

Не знаю как создать ячейки для сапера в html/css/javascriptС помощью div'ов или как? Мне не хватает знаний для этого

209
Дубликат в другое поле с транслитом

Дубликат в другое поле с транслитом

Можно чуточку переделать скрипт, и сделать, чтоб при вводе в поле <input type="text" id="input"> текста, дубликал шел в <input type="text" id="input1">, но с транслитомА...

215