【问题标题】:Firebase+RecyclerView: RecyclerView not displaying on application startFirebase+RecyclerView:RecyclerView 在应用程序启动时不显示
【发布时间】:2016-04-25 20:08:12
【问题描述】:

我正在将 Android Studio 提供的类用于使用带有 ViewPager 的操作栏选项卡的选项卡式活动。在此活动中,我尝试使用 Firebase 数据库中的数据初始化 RecyclerView。

问题:在应用第一次运行时,RecyclerView 为空,如下所示。

如果我在模拟器中关闭并重新打开应用程序,我的 RecyclerView 会按应有的方式填充,如下所示。

关于为什么会发生这种情况的任何想法?我有一个理论,但我一直无法找到解决方案。在尝试阅读FragmentPagerAdapter 页面后,我的印象是片段必须是静态的(我不知道这可能意味着什么,所以如果有人能对此有所了解,我将不胜感激)。在应用程序第一次运行时,它会初始化 RecyclerView。然后它从 Firebase 数据库中添加数据,但由于 RecyclerView 已经初始化,它是空的并且永远不会正确更新。我尝试调用 notify... 方法无济于事。

StudentFragment 的 onCreateView 方法:

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

Homescreen 的 onCreate 方法:

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 上下文设置在另一个应用程序上,该应用程序在主屏幕活动启动后立即启动。任何帮助将不胜感激。

编辑:我正在挖掘 FirebaseUI GitHub 页面,这是最有可能出现问题的地方,并发现另一个用户遇到了完全相同的问题。在 FirebaseRecyclerAdapter 类中的 notifyItemInserted 之后似乎没有调用 onBindViewHolder 。现在修复它...

【问题讨论】:

标签: android-fragments firebase android-recyclerview firebaseui


【解决方案1】:

在我的情况下,这是由mRecyclerView.setHasFixedSize(true); 引起的,如果您注释掉这行代码,列表会正确加载。我从这个讨论中得到了我的解决方案:https://github.com/firebase/FirebaseUI-Android/issues/204

【讨论】:

  • 谢谢!这也是我的问题!
  • 这也是我的问题。
【解决方案2】:

让我试试,正如你在问题标题上所说的,

RecyclerView 在应用程序启动时不显示

所以,

初始化回收器视图和布局管理器。

应该在 onStart 上声明

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

希望对你有帮助!

【讨论】:

    【解决方案3】:
     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() 。为我工作!希望对你有帮助:)**

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,请查看文档:

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

      【讨论】:

        猜你喜欢
        • 2023-04-08
        • 1970-01-01
        • 2014-09-21
        • 1970-01-01
        • 2020-07-26
        • 1970-01-01
        • 2016-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多