【问题标题】:Recycler and adapter does not work when called from OnSuccessListener (Firestore)从 OnSuccessListener (Firestore) 调用时,回收器和适配器不起作用
【发布时间】:2018-08-21 09:54:07
【问题描述】:

我有一个 recyclerView,当直接从 onCreate 调用时,它可以很好地加载。但是,当将其插入 Firestore 集合的 onSuccessListener 时,它不会加载。这是上述代码的示例:

private void populateRecycler(String RootCollection, String UserID) {
    mQuery = mFirestore
            .collection(RootCollection)
            .whereEqualTo("UID", UserID)
            .orderBy("DateAdded", Query.Direction.DESCENDING);
    mAdapter = new OrdersAdapter(mQuery, this) {
        @Override
        protected void onDataChanged() {
            if (getItemCount() == 0) {
                mOrdersRecycler.setVisibility(View.GONE);
                mEmptyView.setVisibility(View.VISIBLE);
            } else {
                mOrdersRecycler.setVisibility(View.VISIBLE);
                mEmptyView.setVisibility(View.GONE);
            }
        }
        protected void onError (FirebaseFirestoreSettings e) {
            // Show a snackbar on errors
            Snackbar.make(findViewById(android.R.id.content),
                    "Error: check logs for info.", Snackbar.LENGTH_LONG).show();
        }
    };

    // Populate and enable RecyclerView
    mOrdersRecycler.setLayoutManager(new LinearLayoutManager(this));
    mOrdersRecycler.setAdapter(mAdapter);
}

但是当我从另一个包含此代码的方法调用populateRecycler(); 时:

mFirestore.collection("UIDOrg")
            .document(UserID)
            .get()
            .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                @Override
                public void onSuccess(DocumentSnapshot documentSnapshot) {
                    UIDOrg uidOrg = documentSnapshot.toObject(UIDOrg.class);
                    mOrgTextView.setText(uidOrg.getOrg());
                    RootCollection = uidOrg.getRootCollection();
                    populateRecycler(RootCollection, UserID);

                }

...它不起作用。谁能解释一下原因?

【问题讨论】:

  • 为了进一步说明,代码在 mAdapter = new OrdersAdapter 之前停止。好像新的 OrdersAdapter 无法加载。当我在其中插入 Log.d 时,什么也没有出现。

标签: android firebase firebase-realtime-database android-recyclerview google-cloud-firestore


【解决方案1】:
  mQuery = mFirestore
        .collection(RootCollection)
        .whereEqualTo("UID", UserID)
        .orderBy("DateAdded", Query.Direction.DESCENDING);

在您的 populateRecycler 方法中是异步操作。这意味着该结果将在未来可用。因此,您需要在填充数据之前等待结果。

阅读这个概念chaining of the tasks。在您的第二个任务完成后,然后填充您的回收站视图。

【讨论】:

  • 为什么 onSuccess 中的populateRecycler 不起作用?从技术上讲(如果我错了,请纠正我),在调用 populateRecycler 之前数据就已经可用了,因为到那时所有的变量赋值都已经完成了。
  • 第一个查询中的数据 (mFirestore.collection("UIDOrg") .document(UserID) .get()) 将在填充中可用,但不能从第二个查询 (mFirestore .collection(RootCollection) .whereEqualTo ("UID", UserID) .orderBy("DateAdded", Query.Direction.DESCENDING);)
  • 您可以在第二个请求中添加第二个成功监听器
  • 第二个 mFirestore.collection(RootCollection) 仅在第一个查询的 onSuccess 之后调用。它从来没有被事先调用过。在使用类似的调用但使用 addOnSuccessListener 之后,我还通过另一个调用填充了另一个 Spinner,但效果很好。
  • 如何在我的情况下添加 OnSuccessListener?你能举一些例子吗?我正在使用它来填充 RecyclerView,方法是使用 mQuery 调用 OrdersAdapter 类。
猜你喜欢
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
相关资源
最近更新 更多