Мой recyclerview не показывает данные из firebase

# #java #android #firebase #firebase-realtime-database

#Ява #Android #огневая база #firebase-база данных в реальном времени

Вопрос:

я разрабатываю приложение на java, которое использует Firebase. Я пытаюсь показать некоторые данные из firebase, которые ранее пользователь вводил ранее, но они ничего не показывают, и я не знаю, почему. Я поместил свой код ниже:

Мой классный пользователь:

 public class userPojo {   private String tipo;  private String titulo;  private String avance;  private String plataforma;   private String uid;   public userPojo() {   }   public String getTipo() {  return tipo;  }   public void setTipo(String tipo) {  this.tipo = tipo;  }   public String getUid() {  return uid;  }   public String getTitulo() {   return titulo;  }   public void setTitulo(String titulo) {  this.titulo = titulo;  }   public String getAvance() {  return avance;  }   public void setAvance (String avance) {  this.avance = avance;  }     public String getPlataforma() {  return plataforma;  }     public void setPlataforma(String plataforma) {  this.plataforma = plataforma;  } }  

Адаптер Класса:

 public class Adapter extends RecyclerView.Adapterlt;Adapter.userpojoviewholdergt; {   Listlt;userPojogt; datos;  public Adapter(Listlt;userPojogt; datos){  this.datos=datos;  }    @NonNull  @Override  public userpojoviewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {  View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_recycler,   parent,false);  userpojoviewholder holder= new userpojoviewholder(v);  return holder;  }   @Override  public void onBindViewHolder(@NonNull userpojoviewholder holder, int position) {  userPojo userpojo = datos.get(position);  holder.textViewTipo.setText(userpojo.getTipo());  holder.textViewTitulo.setText(userpojo.getTitulo());  holder.textViewAvance.setText(userpojo.getAvance());  holder.textViewPlataforma.setText(userpojo.getPlataforma());  }   @Override  public int getItemCount() {  return datos.size();  }   public static class userpojoviewholder extends RecyclerView.ViewHolder{  TextView textViewTitulo, textViewTipo,textViewAvance, textViewPlataforma;  public userpojoviewholder(@NonNull View itemView) {  super(itemView);  textViewTipo=itemView.findViewById(R.id.textviewtipo);  textViewTitulo=itemView.findViewById(R.id.textviewtitulo);  textViewAvance=itemView.findViewById(R.id.textviewavance);  textViewPlataforma=itemView.findViewById(R.id.textviewplataforma);  }  }  } My class visualizar:   public class Visualizar extends AppCompatActivity {  Listlt;userPojogt; datos;  Adapter adapter;  RecyclerView rv;  String userid;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_visualizar);  int nightModeFlags = this.getResources().getConfiguration().uiMode amp;   Configuration.UI_MODE_NIGHT_MASK;  switch (nightModeFlags) {  case Configuration.UI_MODE_NIGHT_YES:  /* si esta activo el modo oscuro lo desactiva */  AppCompatDelegate.setDefaultNightMode(  AppCompatDelegate.MODE_NIGHT_NO);  break;  /* case Configuration.UI_MODE_NIGHT_NO:  /* si esta desactivado el modo oscuro lo activa */  /* AppCompatDelegate.setDefaultNightMode(  AppCompatDelegate.MODE_NIGHT_YES);  break; */  }  userid= FirebaseAuth.getInstance().getUid();  rv= findViewById(R.id.recycler);  rv.setLayoutManager(new LinearLayoutManager(this));   datos=new ArrayListlt;gt;();   FirebaseDatabase database= FirebaseDatabase.getInstance("https://proyecto-daniel-sanchez-default-rtdb.europe-west1.firebasedatabase.app");   adapter=new Adapter(datos);  rv.setAdapter(adapter);  database.getReference().getRoot().addValueEventListener(new ValueEventListener() {  @Override  public void onDataChange(@NonNull DataSnapshot datasnapshot) {  datos.removeAll(datos);  for(DataSnapshot snapshot : datasnapshot.getChildren() ){  userPojo user= snapshot.getValue(userPojo.class);  datos.add(user);   }  adapter.notifyDataSetChanged();  }   @Override  public void onCancelled(@NonNull DatabaseError error) {   }  });  } }  

это моя база данных на Firebase:

огневая база

Ошибка LogCat:

 2021-11-29 17:08:51.597 18298-18298/com.example.proyectofinaldanielsanchez  D/ViewRootImpl: support adaptive color gamut feature! 2021-11-29 17:08:51.598 18298-18298/com.example.proyectofinaldanielsanchez  V/ViewRootImpl: The specified message queue synchronization barrier token  has  not been posted or has already been removed 2021-11-29 17:08:51.603 18298-18298/com.example.proyectofinaldanielsanchez  D/ViewRootImpl[Archivos]: windowFocusChanged hasFocus=false  inTouchMode=true 2021-11-29 17:08:51.627 18298-18298/com.example.proyectofinaldanielsanchez  W/Choreographer: Already have a pending vsync event. There should only be  one  at a time. 2021-11-29 17:08:51.649 18298-18298/com.example.proyectofinaldanielsanchez  D/DecorView: onWindowFocusChangedFromViewRoot hasFocus: true,  DecorView@f1d3935[Visualizar] 2021-11-29 17:08:51.652 18298-18298/com.example.proyectofinaldanielsanchez  D/ViewRootImpl[Visualizar]: windowFocusChanged hasFocus=true  inTouchMode=true 2021-11-29 17:09:02.011 18298-18298/com.example.proyectofinaldanielsanchez  D/CompatibilityChangeReporter: Compat change id reported: 150939131; UID  10617; state: ENABLED[Visualizar]  

Я застрял прямо сейчас, потому что не могу найти ошибку, кто-нибудь может мне помочь? Спасибо.

Комментарии:

1. попробуйте что-нибудь вроде adapter.datos = datos , а затем adapter.notifyDataSetChanged();

2. Пробовал, но это не работает

Ответ №1:

В корне вашей базы данных у вас есть два вложенных динамических уровня узлов:

  1. Сначала есть уровень, который кажется жидкостью.
  2. Затем есть уровень, который представляет собой нажимную клавишу.

Поскольку вы читаете всю эту структуру данных, вам также нужны два вложенных цикла в вашем onDataChange :

 database.getReference().getRoot().addValueEventListener(new ValueEventListener() {  @Override  public void onDataChange(@NonNull DataSnapshot datasnapshot) {  datos.removeAll(datos);  for(DataSnapshot userSnapshot : datasnapshot.getChildren() ){ // 👈 add another loop  for(DataSnapshot snapshot : userSnapshot.getChildren() ){  userPojo user= snapshot.getValue(userPojo.class);  datos.add(user);  }  }  adapter.notifyDataSetChanged();  }   @Override  public void onCancelled(@NonNull DatabaseError error) {  throw error.toException(); // 👈 never ignore errors  } });  

Комментарии:

1. Это работает. Мне нужно отфильтровать его с текущим пользователем, который использует приложение, как я могу это сделать?

2. Правка: я сделал это, спасибо за вашу помощь!