【问题标题】:How do I handle my data model class to get Firebase Firestore data into recyclerView?如何处理我的数据模型类以将 Firebase Firestore 数据放入 recyclerView?
【发布时间】:2019-10-12 07:55:35
【问题描述】:

我有一个这样的 Firestore 数据库:

我想访问每个不同的症状数据,即“Anxiety_data”及其由时间戳和字典组成的子项,然后使用FirebaseUIFirebaseRecyclerViewAdapter将它们放入RecyclerView

我有这个模型类:

  public class EntryDataModel {
private String timestamp, symptom, severity, comment;

public EntryDataModel() {}

public EntryDataModel(String timestamp, String symptom, String severity, String comment) {
    this.timestamp = timestamp;
    this.symptom = symptom;
    this.severity = severity;
    this.comment = comment;
}

public String getTimestamp() {return timestamp;}
public String getSymptom() {return symptom;}
public String getSeverity() {return severity;}
public String getComment() {return comment;}

}

这是我的Query

Query query = db.collection("users").document(user_id).collection("symptom_data");

这里是Firebase RecyclerView Adapter

void fireStoreRecyclerAdapterSetup() {

    FirestoreRecyclerOptions<EntryDataModel> options = new FirestoreRecyclerOptions.Builder<EntryDataModel>()
            .setQuery(query, EntryDataModel.class)
            .build();

    FirestoreRecyclerAdapter adapter = new FirestoreRecyclerAdapter<EntryDataModel, EntryDataHolder>(options) {
        @Override
        public void onBindViewHolder(EntryDataHolder holder, int position, EntryDataModel model) {
            // Bind the Chat object to the ChatHolder
            // ...

           System.out.println("Query: " + query.toString());

        }

        @Override
        public EntryDataHolder onCreateViewHolder(ViewGroup group, int i) {
            // Create a new instance of the ViewHolder, in this case we are using a custom
            // layout called R.layout.message for each item
            View view = LayoutInflater.from(group.getContext())
                    .inflate(R.layout.entry_data_recyclerview_item, group, false);

            return new EntryDataHolder(view);
        }
    };

    recyclerView.setAdapter(adapter);
    adapter.startListening();

}

}

我不知道应该如何设置,以便从每个症状数据字段中获取所有时间戳数组,并将它们全部放在一个列表中,我可以将它们用于recyclerView

也许我不能使用 FirebaseUI Recycler 适配器,或者我需要先遍历每个不同的症状字段并构建 + 附加列表?希望我清楚我想做什么谢谢。

编辑:我已经在 iOS 上完成了,这是我想要的结果:

编辑:我已经添加了这个,获取每个文档的名称,然后一旦我在 for 循环中得到它,我现在尝试获取 Array 值并将其添加到 EntryDataModel 列表中,然后我可以使用我自己的适配器:

编辑:这行得通,我从每个文档中获取我需要的数据。现在我只需要能够迭代字段和时间戳,并使用我的模型创建一个列表。我怎样才能做到这一点? Log.d("example", "DocumentSnapshot data: " + document.getData()); 打印:D/example: DocumentSnapshot data: {1558879769={severity=Mild, symptom=Anxiety, comment=Mild anxiety at work., timestamp=1558879769}, 1558879745={severity=Mild, symptom=Anxiety, comment=Feeling relaxed watching TV., timestamp=1558879745}, 1558879710={severity=Moderate, symptom=Anxiety, comment=Walking the cat., timestamp=1558879710}, 1558879827={severity=Moderate, symptom=Anxiety, comment=Taking the cat for a walk., timestamp=1558879827}, 1558888729={severity=Mild, symptom=Anxiety, comment=The cat is fed up with walking., timestamp=1558888729}} 现在我只需要获取每个时间戳数组并将它们添加到单独的列表中,然后我可以为每个文档执行此操作并获得所有时间戳数组的完整列表。

  void getSymptomData() {
     final CollectionReference colRef = db.collection("users").document(user_id).collection("symptom_data");

     colRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
         @Override
         public void onComplete(@NonNull Task<QuerySnapshot> task) {
             if (task.isSuccessful()) {
                 List<String> list = new ArrayList<>();
                 for (QueryDocumentSnapshot document : task.getResult()) {
                     list.add(document.getId());
                     DocumentReference docRef = colRef.document(document.getId());
                     docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                         @Override
                         public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                             if (task.isSuccessful()) {
                                 DocumentSnapshot document = task.getResult();
                                 if (document.exists()) {
                                     Log.d("Iteration", "DocumentSnapshot data: " + document.getData());
                                 } else {
                                     Log.d("NoDoc", "No such document");
                                 }
                             } else {
                                 Log.d("Failed", "get failed with ", task.getException());
                             }
                         }
                     });
                 }
                 Log.d("listylist", list.toString());
             } else {
                 Log.d("tag", "Error getting documents: ", task.getException());
             }
         }
     });

}

【问题讨论】:

    标签: java firebase android-recyclerview google-cloud-firestore


    【解决方案1】:

    Firebase SDK 可以从 Firestore 文档到 Java 对象的自动映射要求文档中的每个字段名称都与 Java 类中的属性名称相匹配。它没有处理动态字段的机制,例如您示例中的时间戳。

    因此,您必须自己进行转换。为此,您可以使用public T get (FieldPath fieldPath, Class&lt;T&gt; valueType) or public T get (String field, Class&lt;T&gt; valueType) method,它允许您从指定的特定字段中获取对象。因此,您必须遍历时间戳字段,但之后 Firebase SDK 可以将 severitysymptomtimestamp 属性映射到对象。

    【讨论】:

    • 谢谢,我将在哪里以及如何执行此操作?在firebase回收器适配器中?或者我是否需要在使用 .get 请求的该方法后使用普通适配器,制作我自己的列表?
    • 我更新了我的问题,方法是获取文档 ID 并在其引用中添加一个 onComplete 侦听器。我认为在 onComplete 中,我将遍历时间戳字段并创建一个可以与 recyclerView 一起使用的列表,但现在不确定如何使用该方法。
    • 再次更新,非常接近。我现在只需要知道我可以访问每个文档及其字段,如何遍历时间戳并映射对象,以便将其添加到我的对象列表中。
    • doc.getData() 会给你一个Map&lt;String, Object&gt;。所以doc.getData().keySet() 会给你循环的钥匙。
    • 太棒了,设法获取密钥,然后使用您显示的方法将我的类添加到列表中,最后使用了自定义适配器。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2015-12-13
    • 2018-05-23
    • 2012-06-29
    • 1970-01-01
    相关资源
    最近更新 更多