3

Ich verwende die von Android Studio bereitgestellte Klasse für eine Aktivität mit Registerkarten, die Aktionsleistenregisterkarten mit ViewPager verwendet. In dieser Aktivität versuche ich, einen RecyclerView mit Daten aus einer Firebase-Datenbank zu initialisieren.Firebase + RecyclerView: RecyclerView wird beim Start der Anwendung nicht angezeigt

Problem: Beim ersten Start der App ist der RecyclerView leer, wie unten gezeigt.

App's first run.

Wenn ich die Anwendung innerhalb des Emulator schließen und wieder öffnen, mein RecyclerView bevölkert wird, wie es sollte, wie unten gezeigt.

After closing and reopening app.

Irgendwelche Ideen, warum dies geschieht könnte? Ich habe eine Theorie, aber ich konnte keine Lösung finden. Nachdem ich versucht habe, die Seite FragmentPagerAdapter zu lesen, hatte ich den Eindruck, dass die Fragmente statisch sein müssen (ich weiß nicht, welche Auswirkungen das haben könnte, also wenn jemand etwas Licht darauf werfen könnte, würde es geschätzt werden). Beim ersten Start der App wird der RecyclerView initialisiert. Es fügt dann die Daten aus der Firebase-Datenbank hinzu, aber da das RecyclerView bereits initialisiert wurde, ist es leer und wird nie richtig aktualisiert. Ich habe versucht, die notify ... Methoden vergebens zu rufen.

StudentFragment der onCreateView Methode:

private View view; 
private Context c; 
private RecyclerView mRecyclerView; 
private LinearLayoutManager manager; 
private Firebase mFirebaseRef; 
private FirebaseRecyclerAdapter<Student, ViewHolder> firebaseRecyclerAdapter; 


public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    view = inflater.inflate(R.layout.fragment_students, container, false); 
    mFirebaseRef = new Firebase("<your Firebase link here>"); 
    c = getContext(); 

    //Initializes Recycler View and Layout Manager. 
    mRecyclerView = (RecyclerView) view.findViewById(R.id.studentRecyclerView); 
    manager = new LinearLayoutManager(c); 
    mRecyclerView.setHasFixedSize(true); 
    firebaseRecyclerAdapter = 
      new FirebaseRecyclerAdapter<Student, ViewHolder>(
        Student.class, 
        R.layout.single_student_recycler, 
        ViewHolder.class, 
        mFirebaseRef 
      ) { 
       @Override 
       protected void populateViewHolder(ViewHolder viewHolder, Student student, int i) { 
        viewHolder.vFirst.setText(student.getFirst()); 
        viewHolder.vLast.setText(student.getLast()); 
        viewHolder.vDue.setText(Double.toString(student.getCurrentlyDue())); 
        viewHolder.vRadio.setButtonTintList(ColorStateList.valueOf(Color.parseColor(student.getColor()))); 
        Log.d(TAG, "populateViewHolder called"); 
       } 
      }; 

    mRecyclerView.setAdapter(firebaseRecyclerAdapter); 
    mRecyclerView.setLayoutManager(manager); 


    return view; 
} 

ViewHolder:

public static class ViewHolder extends RecyclerView.ViewHolder { 
    public final TextView vFirst; 
    public final TextView vLast; 
    public final TextView vDue; 
    public final RadioButton vRadio; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     vFirst = (TextView) itemView.findViewById(R.id.recycler_main_text); 
     vLast = (TextView) itemView.findViewById(R.id.recycler_sub_text); 
     vRadio = (RadioButton) itemView.findViewById(R.id.recycler_radio_button); 
     vDue = (TextView) itemView.findViewById(R.id.recycler_due_text); 
} 

onCreate der Homescreen-Methode:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_homescreen); 

    // Create the adapter that will return a fragment for each of the three 
    // primary sections of the activity. 
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.container); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(mViewPager); 

} 

Firebase Kontext auf eine andere Anwendung festgelegt wird, sobald die Homescreen-Aktivität beginnt beginnt. Jede Hilfe wird geschätzt.

Bearbeiten: Ich graben durch die FirebaseUI GitHub Seite, wo das Problem am wahrscheinlichsten liegt, und fand einen anderen Benutzer mit genau dem gleichen Problem. Es scheint, dass OnBindViewHolder nicht nach NotifyItemInserted in der FirebaseRecyclerAdapter-Klasse aufgerufen wird. Nun, es zu beheben ...

+0

Ich versuche, das gleiche wie Sie zu tun, aber kann es nicht funktionieren, hier ist mein Problem erklärt, falls Sie Zeit haben, es zu betrachten. Vielen Dank! https://stackoverflow.com/questions/38263758/populateviewholder-not-executing-with-firebaserecycleradapter-android – raphh

Antwort

0

Lassen Sie mich versuchen, gleich nachdem Sie die Frage Titel sagen,

RecyclerView nicht auf Anfrage

so die

starten Anzeige Initialisiert Recycler View und Layout Manager.

sollte auf der onStart

@Override 
    public void onStart() { 
     super.onStart(); 
     mFirebaseRef = new Firebase("<your Firebase link here>"); 
     firebaseRecyclerAdapter = ... 
     //and so on 

Hoffnung erklärt werden, es hilft!

+0

Leider hat das nicht funktioniert – kevinivan05

0
firebaseRecyclerAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { 
     @Override 
     public void onItemRangeInserted(int positionStart, int itemCount) { 
      super.onItemRangeInserted(positionStart, itemCount); 
      int friendlyMessageCount = firebaseRecyclerAdapter.getItemCount(); 
      int lastVisiblePosition = 
        linearLayoutManager.findLastCompletelyVisibleItemPosition(); 
      // If the recycler view is initially being loaded or the 
      // user is at the bottom of the list, scroll to the bottom 
      // of the list to show the newly added message. 
      if (lastVisiblePosition == -1 || 
        (positionStart >= (friendlyMessageCount - 1) && 
          lastVisiblePosition == (positionStart - 1))) { 
       linearLayoutManager.scrollToPosition(positionStart); 
      } 
     } 
    }); 
    recyclerListIdeas.setAdapter(firebaseRecyclerAdapter); 

** Fügen Sie einfach Recyclerview.AdapterDataObserver() hinzu. hat für mich gearbeitet!**)

0

ich das gleiche Problem hatte, überprüfen Sie die Dokumentation: hoffe, es hilft

https://codelabs.developers.google.com/codelabs/firebase-android/#6

es behoben, indem ein Daten Beobachter fügt hinzu:

mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { 
    @Override 
    public void onItemRangeInserted(int positionStart, int itemCount) { 
    super.onItemRangeInserted(positionStart, itemCount); 
    int friendlyMessageCount = mFirebaseAdapter.getItemCount(); 
    int lastVisiblePosition = 
      mLinearLayoutManager.findLastCompletelyVisibleItemPosition(); 
    // If the recycler view is initially being loaded or the 
    // user is at the bottom of the list, scroll to the bottom 
    // of the list to show the newly added message. 
    if (lastVisiblePosition == -1 || 
      (positionStart >= (friendlyMessageCount - 1) && 
        lastVisiblePosition == (positionStart - 1))) { 
     mMessageRecyclerView.scrollToPosition(positionStart); 
     } 
    } 
}); 
Verwandte Themen