Элемент Recyclerview отображается два раза после удаления

#android #firebase #firebase-realtime-database #android-recyclerview

#Android #firebase #firebase-база данных в реальном времени #android-recyclerview

Вопрос:

У меня небольшая проблема с моим приложением для Android. Я пытаюсь удалить элемент из recyclerview и одновременно из базы данных firebase. Все работает нормально, за исключением того, что я замечаю, что каждый раз после удаления элемента он показывает другой элемент два раза. Например, допустим, у меня есть два элемента, item_A и item_B. Если я удаляю item_A, то item_B отображается два раза. Как я могу предотвратить это

  //Code 
    
     FirebaseDatabase.getInstance().getReference()
                                            .child("items").child(uid).child(users.get(position).id).removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                                        @Override
                                        public void onSuccess(Void aVoid) {
                                            Toast.makeText(mContext, "Deleted", Toast.LENGTH_SHORT).show();;
    =
                                        }
                                    });




  databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                progressBar.setVisibility(View.GONE);

                if(dataSnapshot.exists()){

                      for (DataSnapshot postsnapshot : dataSnapshot.getChildren()) {

                          UserInformation2 upload=postsnapshot.getValue(UserInformation2.class);


                          myUploads.add(upload);
                          aAdapter = new ImageAdapter2(ProfileActivity.this, myUploads);
                          recyclerView.setAdapter(aAdapter);
                          aAdapter.notifyDataSetChanged();
                          recyclerView.invalidate();


                      }

                      linearLayout.setVisibility(View.GONE);







                    aAdapter.notifyDataSetChanged();

                }else{

                    //txt1.setVisibility(View.VISIBLE);
                    linearLayout.setVisibility(View.VISIBLE);


                }
  

Ответ №1:

Вы подключаете прослушиватель к базе данных с:

 databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        ...
  

Когда вы запустите этот код, Firebase немедленно загрузит текущие данные в databaseReference и вызовет ваш onDataChange снимок этих данных. Затем он продолжает наблюдать за базой данных, и, если есть шанс, databaseReference он снова вызывает onDataChange обновленный снимок.

Таким образом, при каждом onDataChange вызове он получает полный снимок данных в databaseReference . По этой причине вы захотите очистить текущие данные в myUploads перед добавлением данных из последнего снимка.

Поэтому добавьте myUploads.clear(); в качестве первой строки внутри onDataChange .