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;
}
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP