title: Android - Load data from Firebase Database in Fragment
body: <p>I have a NavigationDrawer activity which is using fragments. In one of my fragments I want to load data from the Firebase database to a RecyclerView.</p>
  
  <p>So I have an ArrayList for the objects I have stored in the database. Then I add a ValueEventListener to my database reference where I add the objects from the database to the array list. And then I give the ArrayList to the RecyclerView Adapter which should create the list with my objects. </p>
  
  <p>When I use addListenerForSingleValueEvent it is never working, I always get an empty RecyclerView. When I use addValueEventListener it is working neither at the start, but when I switch the orientation of my phone to landscape the data suddenly appears. And if I go back to the normal orientation it is still there. But not at the start when I open the fragment. </p>
  
  <p>Here is my code of the fragment class:</p>
  
  <pre><code>public class LogFragment extends Fragment {
  
      private RecyclerView recyclerView;
      private RecyclerView.Adapter rvAdapter;
      private RecyclerView.LayoutManager rvLayoutManager;
      private ArrayList&lt;LogEntry&gt; entries;
  
      private DatabaseReference databaseReference;
      private DatabaseReference logReference;
      private FirebaseAuth firebaseAuth;
      private FirebaseUser firebaseUser;
  
      public LogFragment() {
          // Required empty public constructor
      }
  
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  
          View rootView = inflater.inflate(R.layout.fragment_log, container, false);
  
          databaseReference = FirebaseDatabase.getInstance().getReference();
          firebaseAuth = FirebaseAuth.getInstance();
          firebaseUser = firebaseAuth.getCurrentUser();
  
          loadEntries();
  
          recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
          rvLayoutManager = new LinearLayoutManager(getActivity());
          recyclerView.setLayoutManager(rvLayoutManager);
  
          rvAdapter = new RvAdapter(entries);
          recyclerView.setAdapter(rvAdapter);
  
          // Inflate the layout for this fragment
          return rootView;
      }
  
      private void loadEntries(){
          entries = new ArrayList&lt;&gt;();
          logReference = databaseReference.child("log").child(firebaseUser.getUid());
          ValueEventListener valueEventListener = new ValueEventListener() {
              @Override
              public void onDataChange(DataSnapshot dataSnapshot) {
  
                  for(DataSnapshot ds : dataSnapshot.getChildren()){
                      entries.add(ds.getValue(LogEntry.class));
                  }
  
              }
  
              @Override
              public void onCancelled(DatabaseError databaseError) {
                  Log.w("LogFragment", "loadLog:onCancelled", databaseError.toException());
              }
          };
          logbuchReference.addValueEventListener(valueEventListener);
  
      }
  }
  </code></pre>
  
  <p>And here is my RvAdapter.java:</p>
  
  <pre><code>public class RvAdapter extends RecyclerView.Adapter&lt;RvAdapter.MyViewHolder&gt; {
  
      private ArrayList&lt;LogEntry&gt; entries;
  
      public RvAdapter(ArrayList&lt;LogEntry&gt; entries){
          this.entries = entries;
      }
  
      @Override
      public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  
          View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.log_entry_item, null);
  
          return new MyViewHolder(itemView);
      }
  
      @Override
      public void onBindViewHolder(MyViewHolder holder, int position) {
  
          SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
          SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
  
          holder.tvAction.setText(entries.get(position).action);
          holder.tvDate.setText(dateFormat.format(entries.get(position).date)+"\n"+timeFormat.format(entries.get(position).date));
          holder.ivIcon.setImageResource(entries.get(position).icon);
  
          holder.itemView.setOnClickListener(new View.OnClickListener(){
  
              @Override
              public void onClick(View v) {
                  // Do something
              }
          });
  
      }
  
      @Override
      public int getItemCount() {
          return entries.size();
      }
  
      public class MyViewHolder extends RecyclerView.ViewHolder {
  
          TextView tvAction, tvDate;
          ImageView ivIcon;
  
          public MyViewHolder(View itemView) {
              super(itemView);
              tvAction = (TextView) itemView.findViewById(R.id.tvAction);
              tvDate = (TextView) itemView.findViewById(R.id.tvDate);
              ivIcon = (ImageView) itemView.findViewById(R.id.ivIcon);
          }
      }
  }
  </code></pre>
  
  <p>And here my LogEntry.java:</p>
  
  <pre><code>public class LogEntry {
  
      public String action;
      public Date date;
      public int icon;
      public String message;
  
      public LogEntry() {}
  
      public LogEntry(String action, Date date, int icon, String message) {
          this.action = action;
          this.date = date;
          this.icon = icon;
          this.message = message;
      }
  }
  </code></pre>
  
  <p>Someone know what could be the problem?</p>
  
  <p>EDIT:</p>
  
  <p>When I System.out.prinln the ArrayList right after the for() I get the data. So loading the data from the database is working. But presenting the data is not working.</p>