Поскольку вы вызываете addValueEventListener
, Firebase вызывает ваш onDataChange
с текущими данными как можно быстрее, а затем продолжает отслеживать изменения в базе данных. Всякий раз, когда происходит изменение, он снова вызывает ваш onDataChange
с обновленными данными.
В вашем onDataChange
агрегате вы изменяете данные, вызывая setValue
. Поскольку эти данные находятся в том месте, которое вы слушаете, они запускают слушателя, который снова вызывает ваш onDataChange
. Таким образом, вы получите al oop of onDataChange
-> setValue
-> onDataChange
-> setValue
....
. Самое простое решение - использовать addListenerForSingleValueEvent
, которое дает только начальное значение и не слушает. Таким образом, вы получите onDataChange
-> setValue
и ничего больше.
В коде:
final DatabaseReference ref = FirebaseDatabase.getInstance().getReference( "Usuarios" );
ref.child( mAuth.getUid() ).child( "Favoritos" )
.addListenerForSingleValueEvent( new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
botaoFavorito.setImageResource( R.drawable.ic_favoritos );
ref.child( mAuth.getUid() ).child( "Favoritos" ).child( posicao ).setValue(null);
}
else {
botaoFavorito.setImageResource( R.drawable.ic_favorito_adicionado );
ref.child( mAuth.getUid() ).child( "Favoritos" ).child( posicao ).setValue(posicao);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // don't ignore errors
}
} );