Recyclerview 适配器:java.util.ArrayList 无法转换为 com.google.firebase.firestore.QuerySnapshot

Posted

技术标签:

【中文标题】Recyclerview 适配器:java.util.ArrayList 无法转换为 com.google.firebase.firestore.QuerySnapshot【英文标题】:Recyclerview Adapter: java.util.ArrayList cannot be cast to com.google.firebase.firestore.QuerySnapshot 【发布时间】:2021-03-24 02:44:02 【问题描述】:

我是新手,不熟悉使用 recyclerview 适配器。我有这种方法可以将数据加载到 recyclerview 适配器中。将使用合并查询过滤数据。但是应用程序崩溃了,我得到了 java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.google.firebase.firestore.QuerySnapshot。有谁知道如何解决这个问题?

private void loadData()

        if(modelArrayList.size()>0)
            modelArrayList.clear();

        storageReference = FirebaseStorage.getInstance().getReference();
        Query query = collectionReference.whereArrayContains("pet", pettype);
        Query query2 = collectionReference.whereArrayContains("service", "Pet Sitting");
        Query query3 = collectionReference.whereArrayContains("petnum", petnumber);
        Query query4 = collectionReference.whereArrayContains("region", reg);
        Query query5 = collectionReference.whereArrayContains("subregion", subreg);

        Task task = query.get();
        Task task2 = query2.get();
        Task task3 = query3.get();
        Task task4 = query4.get();
        Task task5 = query5.get();

        Task combinedtask = Tasks.whenAllSuccess(task, task2, task3, task4, task5);

        combinedtask.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() 
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) 
                for(DocumentSnapshot querySnapshot: task.getResult())
                    model model = new model(querySnapshot.getString("firstname"),
                            querySnapshot.getString("lastname"),
                            querySnapshot.getString("description"),
                            querySnapshot.getString("userID"));

                    modelArrayList.add(model);
                
                adapter = new My_recyclerview_adapter(Pet_sitting_result.this, modelArrayList);
                recycler_view.setAdapter(adapter);
            
        ).addOnFailureListener(new OnFailureListener() 
            @Override
            public void onFailure(@NonNull Exception e) 
                Toast.makeText(Pet_sitting_result.this, "Error", Toast.LENGTH_SHORT);
            
        );
    

【问题讨论】:

【参考方案1】:

由于您的combinedTask 是其他几个任务的结果,因此它将产生List 对象,而不是QuerySnapshot。因此,您的成功回调应该声明它接受List&lt;Task&lt;?&gt;&gt; 而不是Task&lt;QuerySnapshot&gt;。您传递给whenAllSuccess() 的每个任务的列表中都会有一项。您必须编写代码将每个查询的各个快照从列表中提取出来,并根据需要分别处理它们。

您可能想进一步熟悉您在此处使用的Tasks API,并研究Tasks.whenAll() 的API 文档。

【讨论】:

我不太了解拉单个快照部分。介意详细说明吗? 访问列表中的任务以获取每个查询的结果。它就像任何其他列表一样。 我不太确定结果是什么,但我正在尝试为所有查询创建一个 AND 运算符。例如,用户必须满足所有五个条件才能显示其数据。如果他们只满足

以上是关于Recyclerview 适配器:java.util.ArrayList 无法转换为 com.google.firebase.firestore.QuerySnapshot的主要内容,如果未能解决你的问题,请参考以下文章

Fragment,RecyclerView:没有附加适配器;跳过布局

片段中的recyclerview的“RecyclerView:没有附加适配器;跳过布局”[重复]

如何更新 RecyclerView 适配器数据

RecyclerView 适配器中的 onBackPressed()

当调用 RecyclerView 适配器的“notifyDataSetChanged()”时,RecyclerView 抛出“java.lang.Throwable: addInArray”

RecyclerView:没有附加适配器;跳过布局[重复]