#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
.