3

Я использую класс, предусмотренный для Android Studio, для активности с вкладками, в котором используются вкладки Action Bar с ViewPager. Внутри этого действия я пытаюсь инициализировать RecyclerView с данными из базы данных Firebase.Firebase + RecyclerView: RecyclerView не отображается при запуске приложения

Проблема: при первом запуске приложения RecyclerView пуст, как показано ниже.

App's first run.

Если закрыть и снова открыть приложение из эмулятора, мой RecyclerView их получает, как и должно быть, как показано ниже.

After closing and reopening app.

Любые идеи, почему это может происходить? У меня есть теория, но я не смог найти решение. Прочитав страницу FragmentPagerAdapter, у меня сложилось впечатление, что фрагменты должны быть статичными (я не знаю, каковы могут быть последствия этого, поэтому, если кто-то может пролить свет на это, это будет оценено). В первом запуске приложения он инициализирует RecyclerView. Затем он добавляет данные из базы данных Firebase, но поскольку RecyclerView уже инициализирован, он пуст и никогда не обновляется должным образом. Я пробовал называть методы уведомления ... безрезультатно.

метод onCreateView StudentFragment в:

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 Homescreen в:

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 контекст установлен на другое приложение, которое начинается, как только Homescreen деятельности начинается. Любая помощь будет оценена по достоинству.

Редактировать: Я копал страницу FirebaseUI GitHub, в которой, скорее всего, лежит проблема, и нашел другого пользователя с той же проблемой. Кажется, что onBindViewHolder не вызывается после notifyItemInserted в классе FirebaseRecyclerAdapter. Теперь, чтобы исправить это ...

+0

Я пытаюсь сделать то же самое, что и вы, но не могу заставить его работать, вот моя проблема объясняется, если у вас есть время, чтобы посмотреть на нее. Благодаря! https://stackoverflow.com/questions/38263758/populateviewholder-not-executing-with-firebaserecycleradapter-android – raphh

ответ

0

Позвольте мне, как вы говорите о названии вопроса,

RecyclerView не отображается при запуске приложения

так, то

Инициализирует Recycler View и Layout Manager.

должен быть объявлен на OnStart

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

Надеется, что это помогает!

+0

К сожалению, это не сработало – 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); 

** Просто добавьте Recyclerview.AdapterDataObserver(). работал на меня!надеюсь, что это помогает:) **

0

я была такая же проблема, обратитесь к документации:

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

неподвижную его путем добавления наблюдателя данных:

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); 
     } 
    } 
}); 
3

В моем случае это было вызванный mRecyclerView.setHasFixedSize(true); Если вы закомментируете эту строку кода, список загрузится правильно. Я получил свое решение из этого обсуждения: https://github.com/firebase/FirebaseUI-Android/issues/204

+0

Спасибо! Это тоже моя проблема! –

+0

Отлично, что моя проблема. – dsharew