1

Ich habe alles versucht, aber meine Daten von Firebase wird nicht automatisch geladen, wenn ich die App öffne und ich muss auf einen Editiertext klicken, um die Daten zu laden.Recylerview lädt nicht automatisch Daten von Firebase Android Studio

Ich habe

versucht
adapter.Update(data); 
    recycler.invalidate(); 
    notifyDataSetChanged(); 
    adapter.notifyDataSetChanged(); 

Bitte kann mir jemand helfen.

EDITED:

Ich spare so zu Firebase:

public FirebaseHelper(DatabaseReference db) { 
     this.db = db; 
    } 
    //WRITE IF NOT NULL 
    public Boolean save(Spacecraft spacecraft) 
    { 
     if(spacecraft==null) 
     { 
      saved=false; 
     }else 
     { 
      try 
      { 
       db.child("Spacecraft").push().setValue(spacecraft); 
       saved=true; 
      }catch (DatabaseException e) 
      { 
       e.printStackTrace(); 
       saved=false; 
      } 
     } 
     return saved; 
    } 
    //IMPLEMENT FETCH DATA AND FILL ARRAYLIST 
    private void fetchData(DataSnapshot dataSnapshot) 
    { 
     spacecrafts.clear(); 
     for (DataSnapshot ds : dataSnapshot.getChildren()) 
     { 
      Spacecraft spacecraft=ds.getValue(Spacecraft.class); 
      spacecrafts.add(spacecraft); 
     } 
    } 
    //READ THEN RETURN ARRAYLIST 
    public ArrayList<Spacecraft> retrieve() { 
     db.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       fetchData(dataSnapshot); 
      } 
      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s){ 

       fetchData(dataSnapshot); 
      } 
     }); 
     return spacecrafts; 
    } 
} 

Meine viewholder Klasse

public MyViewHolder(View itemView) { 
     super(itemView); 
     nameTxt= (TextView) itemView.findViewById(R.id.nameTxt); 
     propTxt= (TextView) itemView.findViewById(R.id.propellantTxt); 
     descTxt= (TextView) itemView.findViewById(R.id.descTxt); 
     itemView.setOnClickListener(this); 
    } 
    public void setItemClickListener(ItemClickListener itemClickListener) 
    { 
     this.itemClickListener=itemClickListener; 
    } 
    @Override 
    public void onClick(View view) { 
     this.itemClickListener.onItemClick(this.getLayoutPosition()); 
    } 

Meine Adapterklasse

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> { 
    Context c; 
    ArrayList<Spacecraft> spacecrafts; 
    public MyAdapter(Context c, ArrayList<Spacecraft> spacecrafts) { 
     this.c = c; 
     this.spacecrafts = spacecrafts; 
    } 
    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v=LayoutInflater.from(c).inflate(R.layout.model,parent,false); 
     return new MyViewHolder(v); 
    } 
    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     final Spacecraft s=spacecrafts.get(position); 
     holder.nameTxt.setText(s.getName()); 
     holder.propTxt.setText(s.getPropellant()); 
     holder.descTxt.setText(s.getDescription()); 
     holder.setItemClickListener(new ItemClickListener() { 
      @Override 
      public void onItemClick(int pos) { 
       //OPEN DETAI ACTIVITY 
       openDetailActivity(s.getName(),s.getDescription(),s.getPropellant()); 
      } 
     }); 
    } 
    @Override 
    public int getItemCount() { 
     return spacecrafts.size(); 
    } 
    //OPEN DETAIL ACTIVITY 
    private void openDetailActivity(String...details) 
    { 
     Intent i=new Intent(c,DetailActivity.class); 
     i.putExtra("NAME_KEY",details[0]); 
     i.putExtra("DESC_KEY",details[1]); 
     i.putExtra("PROP_KEY",details[2]); 
     c.startActivity(i); 
    } 

in meinem mainactivity in ONC reate Ich mag diese

recycler = (RecyclerView) rootView.findViewById(R.id.recycler); 
recycler.setLayoutManager(new LinearLayoutManager(getActivity())); 
database = FirebaseDatabase.getInstance().getReference(); 
spacecraft = new ArrayList<>(); 
firebasehelper = new FirebaseHelper(database); 
adapter = new JAdapter(getActivity(), firebasehelper.retrieve()); 
recycler.setAdapter(adapter); 
+0

Geben Sie den Code des Beobachters ein, mit dem Sie Daten erhalten. –

+0

Hallo, ich habe einen Link zu dem Tutorial eingefügt, das ich mir angesehen habe, um Firebase-Daten zu lesen. Bitte lassen Sie mich wissen, wenn Sie möchten, dass ich den Code hier einfügen. Ich habe genau den gleichen Code geschrieben. –

+0

Poste deinen Code und dein Video.Nicht von wo Sie gelernt haben –

Antwort

0

Das Problem, die Daten anzurufenden ist mit der retrieve Methode: Es ist ein ChildEventListener hinzufügen, die asynchron ausführt (das heißt es nicht, bis sich der Datenblock Kinder geholt wird) und dann sofort gibt die spacecrafts-Liste zurück, die immer noch nicht vom asynchronen Listener-Code gefüllt ist.

Sie sollen die RecyclerView Adapter in dem eigentlichen Code aktualisieren, die Daten abruft, dh in der fetchData Methode, zB:

private void fetchData(DataSnapshot dataSnapshot) 
{ 
    spacecrafts.clear(); 
    for (DataSnapshot ds : dataSnapshot.getChildren()) 
    { 
     Spacecraft spacecraft=ds.getValue(Spacecraft.class); 
     spacecrafts.add(spacecraft); 
    } 
    adapter.spacecrafts = spacecrafts; // update the list in the adapter 
    adapter.notifyDataSetChanged(); // refresh 
} 

In diesem Fall wird die retrieve Verfahren können einen void Rückgabetyp, da es sinnlos ist, um die Liste zurückzugeben.

+0

seine nicht reconigning Adapter in fetchData –

+0

@JoshJoe Ich hatte nicht beabsichtigt, für mein Schnipsel genau so wie es ist kopiert werden. Die Idee ist, dass Sie die Möglichkeit finden sollten, den Adapter von Ihrem 'FirebaseHelper' aus aufzurufen. Sie können den Adapter entweder in einem Konstruktor übergeben oder eine Callback-Schnittstelle an die 'retrieve'-Methode übergeben, und dieser Callback wird aufgerufen, wenn das Abrufen aller untergeordneten Elemente abgeschlossen ist. – manouti

+0

Ich habe mit rumgespielt, aber ich kann es nicht funktionieren –

0

Verwenden Sie FirebaseRecyclerAdapter zum Laden der Daten aus Firebase.

0

die Helfer constructer modifiziert so sein:

public FirebaseHelper(Context c, DatabaseReference db, ListView lv) { 
    this.c = c; 
    this.db = db; 
    this.lv = lv; 
} 

dann diese für Schleife nach dem der FetchData Methode hinzufügen:

if (spacecrafts.size() > 0) 
    { 
     adapter = new CustomAdapter(c, spacecrafts); 
     lv.setAdapter(adapter); 
     adapter.notifyDataSetChanged(); 
    } 

dann in der Haupttätigkeit es wie folgt ändern:

helper = new FirebaseHelper(this, db, lv); 
    //ADAPTER 
    //adapter = new CustomAdapter(this, helper.retrieve()); 
    //lv.setAdapter(adapter); 
    helper.retrieve(); 

sollte dies für Sie arbeiten.

0

Überprüfen Sie, ob Sie den Adapter in der Methode onCreate() einrichten oder nicht. Wenn Sie ihn in onStart() aufrufen, lädt er die Daten nicht automatisch. Setze den Adapter in der onCreate() Methode.

Verwandte Themen