2017-12-22 12 views
0

Dies ist mein Code:Lesefirebase-Datenbank und anzeigen In RecyclerView: Android

Liste.java Datei:

public class Liste extends AppCompatActivity{ 

    RecyclerView myRecyclerview; 
    MyAdapter adapter; 
    List<Dentist> listDentist; 
    FirebaseDatabase FDB; 
    DatabaseReference DBR; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate (savedInstanceState); 
     setContentView (R.layout.activity_liste); 

     myRecyclerview = (RecyclerView) findViewById (R.id.myRecycler); 
     RecyclerView.LayoutManager LM = new LinearLayoutManager (getApplicationContext()); 
     myRecyclerview.setLayoutManager (LM); 
     myRecyclerview.setItemAnimator (new DefaultItemAnimator()); 
     myRecyclerview.addItemDecoration (new DividerItemDecoration (getApplicationContext(),LinearLayoutManager.VERTICAL)); 

     listDentist = new ArrayList<> (); 

     adapter = new MyAdapter (listDentist); 

     FDB= FirebaseDatabase.getInstance(); 
     GetDataFirebase(); 

void GetDataFirebase(){ 
     DBR = FDB.getReference ("dentistes"); 

     DBR.addChildEventListener (new ChildEventListener () { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

       Dentist data = dataSnapshot.getValue (Dentist.class); 
       //Add to Arraylist 
       listDentist.add (data); 
       //Add list into adapter 
       myRecyclerview.setAdapter (adapter); 


      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
    } 


public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{ 

     List<Dentist> listArray; 

     public MyAdapter (List<Dentist> List){ 
      this.listArray = List; 
     } 

     @Override 
     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View view = LayoutInflater.from (parent.getContext()).inflate (R.layout.itemview,parent,false); 
      return new MyViewHolder(view); 
     } 

     @Override 
     public void onBindViewHolder(MyViewHolder holder, int position) { 
      Dentist data = listArray.get (position); 
      holder.MyText.setText (data.getName()); 
     } 
     public class MyViewHolder extends RecyclerView.ViewHolder{ 
      TextView MyText; 

      public MyViewHolder(View itemView) { 
       super (itemView); 
       MyText = (TextView)itemView.findViewById (R.id.textview_dentist); 
      } 
     } 

     @Override 
     public int getItemCount() { 
      return listArray.size(); 
     } 
    } 
} 

activity_liste.xml Datei

<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <android.support.v7.widget.RecyclerView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:id="@+id/myRecycler"> 
     </android.support.v7.widget.RecyclerView> 
</LinearLayout> 

iteview .xml-Datei

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/textview_dentist" 
      android:layout_marginBottom="15dp" 
      android:layout_marginTop="15dp" 
      android:layout_marginLeft="15dp" 
      android:textSize="20sp"/> 

    </LinearLayout> 

Meine Klasse Modell:

public class Dentist { 
    private String Name; 

    public String getName() { 
     return Name; 
    } 

    public void setName(String name) { 
     Name = name; 
    } 
} 

Ich habe zwei Fragen:

  • Die Liste der Zahnärzte richtig in meinem Recyclerview angezeigt, aber die logcat zeigt mir "E/RecyclerView : Kein Adapter angeschlossen; Layout überspringen ": wie kann ich das korrigieren?

  • Wenn ich die Struktur meines Klassenmodells ändere: zum Beispiel füge ich Adresse und TelNumber hinzu: wie ich meinen Code ändern sollte, um foreach Zahnarzt in meinem Recyclerview seinen Namen anzuzeigen , Adresse und NumTel

Antwort

1

Um dies zu lösen, bitte meine Antworten unten sehen:

  1. Verschieben dieser Codezeile

    adapter = new MyAdapter(listDentist); 
    

Innen onChildAdded() Methode. Ihr Adapter muss innerhalb dieser Methode deklariert und verwendet werden.

  1. Sie müssen Ihre Dentist Klasse ändern, indem Sie diese privaten Felder hinzufügen und die entsprechenden öffentlichen Setter und Getters hinzufügen.
+0

1- Die Meldung „E/RecyclerView: Kein Adapter angeschlossen, das Überspringen Layout“ wird immer in dem Protokoll Katze angezeigt. 2- Ich weiß, dass ich diese privaten Felder der Zahnarzt-Klasse hinzufügen sollte, aber ich bin blockiert, wie ich den Code in der Liste.java-Datei ändern sollte. – Nesrine

+0

Stellen Sie sicher, dass Sie diese Anweisung aus dem Thread "main" in der onChildAdded() -Methode aufrufen. Und da ist der einzige Ort, an dem du das tust. Deklarieren Sie auch die 'myRecyclerview' in dieser Methode. Funktioniert es jetzt? –

+0

Die Liste der Zahnärzte richtig in meinem Recyclerview angezeigt, aber die logcat zeigt diesen Fehler wieder: aber es ist kein Problem. Ich brauche eine Antwort für meine zweite Frage. – Nesrine

0

Um die Warnung in logcat loszuwerden, den Adapter in Ihrem onCreate Verfahren eingestellt und adapter.notifyDataSetChanged() in der onChildAdded Methode aufrufe, Werte ...

public class Liste extends AppCompatActivity{ 

    RecyclerView myRecyclerview; 
    MyAdapter adapter; 
    List<Dentist> listDentist; 
    FirebaseDatabase FDB; 
    DatabaseReference DBR; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate (savedInstanceState); 
     setContentView (R.layout.activity_liste); 

     myRecyclerview = (RecyclerView) findViewById (R.id.myRecycler); 
     RecyclerView.LayoutManager LM = new LinearLayoutManager (getApplicationContext()); 
     myRecyclerview.setLayoutManager (LM); 
     myRecyclerview.setItemAnimator (new DefaultItemAnimator()); 
     myRecyclerview.addItemDecoration (new DividerItemDecoration (getApplicationContext(),LinearLayoutManager.VERTICAL)); 

     listDentist = new ArrayList<> (); 

     adapter = new MyAdapter (listDentist); 

     //Set empty adapter here 
     myRecyclerView.setAdapter(adapter); 

     FDB= FirebaseDatabase.getInstance(); 
     GetDataFirebase(); 

void GetDataFirebase(){ 
     DBR = FDB.getReference ("dentistes"); 

     DBR.addChildEventListener (new ChildEventListener () { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

       Dentist data = dataSnapshot.getValue (Dentist.class); 
       //Add to Arraylist 
       listDentist.add (data); 
       //Add list into adapter 


       adapter.notifyDataSetChanged(); 

      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
    } 


public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{ 

     List<Dentist> listArray; 

     public MyAdapter (List<Dentist> List){ 
      this.listArray = List; 
     } 

     @Override 
     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View view = LayoutInflater.from (parent.getContext()).inflate (R.layout.itemview,parent,false); 
      return new MyViewHolder(view); 
     } 

     @Override 
     public void onBindViewHolder(MyViewHolder holder, int position) { 
      Dentist data = listArray.get (position); 
      holder.MyText.setText (data.getName()); 
     } 
     public class MyViewHolder extends RecyclerView.ViewHolder{ 
      TextView MyText; 

      public MyViewHolder(View itemView) { 
       super (itemView); 
       MyText = (TextView)itemView.findViewById (R.id.textview_dentist); 
      } 
     } 

     @Override 
     public int getItemCount() { 
      return listArray.size(); 
     } 
    } 
} 

Und für Ihren zweiter zu aktualisieren Frage, wie von Alex Mamo erwähnt, müssen Sie Felder hinzufügen, die Sie wollen und entsprechende Getter und Setter in Ihrer Zahnarzt-Klasse.

Verwandte Themen