TransWikia.com

Android Studio al realizar una consulta con Firebase y posteriormente insertar valores se insertan infinitamente

Stack Overflow en español Asked by Daniel García on December 14, 2020

soy novato aún en programación, y estoy haciendo una app de noticias con firebase y en un fragment llamo a la referencia de firebase y tengo un bucle con ValueEventListener donde le digo que si el titulo coincide con el que le paso que me coja la clave de esta noticia, y fuera del bucle creo un objeto map donde le inserto valores y hago un push donde se lo paso a la referencia para que lo suba a firebase, sin embargo no solo me crea una vez el objeto, si no que se crea infinitamente y no entiendo que es lo que está mal porque en otros fragments lo tengo de forma parecida y funciona bien. ¿Alguien me podría echar una mano?. Porque yo no encuentro el fallo.
Aquí dejo el xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/fondo_periodico2"
    tools:context=".CrearComentario2">


    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="64dp"
        android:text="Usuario:"
        android:textColor="@color/azul"
        android:textSize="28dp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textUsu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="36dp"
        android:text=""
        android:textSize="24dp"
        android:textColor="@color/negro"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.542"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="72dp"
        android:text="Mensaje"
        android:textColor="@color/azul"
        android:textSize="28dp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textUsu" />

    <EditText
        android:id="@+id/editComentario"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:layout_marginTop="44dp"
        android:ems="10"
        android:gravity="start|top"
        android:inputType="textMultiLine"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView5" />

    <Button
        android:id="@+id/btnComentar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="76dp"
        android:text="Agregar Comentario"
        android:background="@drawable/boton_pulsado"
        android:textColor="@drawable/txtcolor"
        android:textStyle="bold"
        android:foreground="@drawable/redondeado"
        android:textSize="32dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editComentario" />
</androidx.constraintlayout.widget.ConstraintLayout>

Y a continuación dejo el código del fragment:

public class CrearComentario2 extends Fragment {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;


    private TextView usu;
    private EditText mensaje;
    private Button button;

    private String key=null;
    private String comun=null;
    private String dep=null;
    private DatabaseReference data;
    private FirebaseAuth fAuth;

    private String user=null;
    private int cont=0;
    private String id=null;

    public CrearComentario2() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment CrearComentario2.
     */
    // TODO: Rename and change types and number of parameters
    public static CrearComentario2 newInstance(String param1, String param2) {
        CrearComentario2 fragment = new CrearComentario2();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View root=inflater.inflate(R.layout.fragment_crear_comentario2, container, false);
        key=getArguments().getString("esp");
        comun=getArguments().getString("comun");
        dep=getArguments().getString("dep");
        usu=root.findViewById(R.id.textUsu);
        mensaje=root.findViewById(R.id.editComentario);
        button=root.findViewById(R.id.btnComentar);
        fAuth=FirebaseAuth.getInstance();
        data= FirebaseDatabase.getInstance().getReference();
        user=obtenerUser(fAuth.getCurrentUser().getUid());

        usu.setText(user);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(key!=null){
                    comentarEsp(mensaje.getText().toString());
                }
            }
        });
        return root;
    }

    public void comentarEsp(final String mensaje) {
        data.child("Noticia").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for(DataSnapshot snapCom :snapshot.getChildren()){
                    if(key.equals(snapCom.child("titular").getValue(String.class))){
                        id=snapCom.getKey();
                    }
                }
                int num=obtenerNumeroComentario("Noticia",id);
                Date myDate=new Date();
                String fecha = new SimpleDateFormat("dd-MM-yyyy").format(myDate);

                Map<String, Object> map = new HashMap<>();
                map.put("numero",num+1);
                map.put("usuario",user);
                map.put("fecha",fecha);
                map.put("mensaje",mensaje);
                map.put("upvotes",0);
                map.put("downvotes",0);
                data.child("Noticia").child(id).child("Comentarios").push().setValue(map).addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Toast.makeText(getContext(),"Se ha comentado con exito",Toast.LENGTH_SHORT).show();
                    }
                });
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });


    }

    private int obtenerNumeroComentario(final String noticia, final String id) {
        data.child(noticia).child(id).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {


                for (DataSnapshot snap :snapshot.getChildren()){
                    if(snap.child("Comentarios").exists()){
                        data.child(noticia).child(id).child("Comentarios").addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot snapshot) {
                                for(DataSnapshot snaps :snapshot.getChildren()){
                                    cont++;
                                }
                            }

                            @Override
                            public void onCancelled(@NonNull DatabaseError error) {

                            }
                        });
                    }
                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });

        return cont;

    }

    private String obtenerUser(final String uid){

        data.child("Users").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for(DataSnapshot snap : snapshot.getChildren()){
                    if(snap.getKey().equals(uid)){

                        user=snap.child("nombre").getValue(String.class);;
                        Toast.makeText(getContext(),user,Toast.LENGTH_SHORT).show();
                    }

                }

            }
            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
        String usuario=user;
        return usuario;

    }

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP