从 Firestore 中检索嵌套对象并放入 Android 中的 RecyclerView?
Posted
技术标签:
【中文标题】从 Firestore 中检索嵌套对象并放入 Android 中的 RecyclerView?【英文标题】:Retrieve a nested object from Firestore and put into RecycleView in Android? 【发布时间】:2020-04-26 15:22:42 【问题描述】:我正在尝试在单个文档中使用附加的图像数据结构填充 android 中的 RecylerView
。我想列出每个 ID 的每个名称、地区、图像。
它需要在不破坏子集合的情况下完成。是否有任何可能的智能方法来填充RecylerView
。谢谢
这是我正在使用的示例数据。 [![在此处输入图片描述][1]][1]
编辑 1: 我尝试实现以下,它有效吗?
private void setUpRecyclerView(View view)
CheckinList = new ArrayList<>();
notebookRef.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>()
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots)
for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots)
user user = documentSnapshot.toObject(user.class);
HashMap<String, HashMap> about = user.getAbout();
for(Map.Entry<String, HashMap> entry : about.entrySet())
String key = entry.getKey();
HashMap<String, HashMap> value = entry.getValue();
String Name = "";
String District = "";
String imageUrl = "";
for (Map.Entry<String, HashMap> entry3 : value.entrySet())
String key3 = entry3.getKey();
if (key3 == "name")
Name = entry3.getValue().toString();
else if (key3 == "district")
District = entry3.getValue().toString();
else if (key3 == "imageurl")
imageUrl = entry3.getValue().toString();
CheckinList.add(new Checkin(Name, District, imageUrl));
);
adapter = new NoteAdapter(CheckinList, mContext);
RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
recyclerView.setAdapter(adapter);
```
full data scheme screenshot
[![enter image description here][2]][2]
[1]: https://i.stack.imgur.com/2Jspj.jpg
[2]: https://i.stack.imgur.com/iwsat.jpg
【问题讨论】:
到目前为止你尝试过什么?请同时添加您的数据库的另一个屏幕截图以查看您的根集合。 添加了屏幕截图。我只有一个根集合。但只是带有嵌套对象的文档。我要查询最底层的嵌套地图对象 很抱歉,我看到的截图和以前一样。可以查一下吗? 抱歉,拖错了图片。更新 【参考方案1】:如果ID个数不大,则需要嵌套for循环。
如果您可以访问数据库,则应该将架构更改为类似的内容
Document(randomID) -> Collection (about) -> Document (IDs) = Data (name/district/image);
在此之后,您可以简单地进行嵌套 Firebase 查询来访问数据。
如果您在使用我给定架构的 Firebase 查询方面需要帮助,或者您想使用自己的架构并获取数据,请提供更多信息。
编辑 1
不建议,因为这不是获取数据的最佳方式
FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
firebaseFirestore
.collection("your collection")
.document("your doc).get()
.addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>()
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task)
if (task.isSuccessful())
int docSize = 10; //size of IDs (assuming 10)
for (int index = 0; index <= docSize; index++)
HashMap<String, Object> dataMap = (HashMap<String, Object>) task.getResult().get("1000000"+index);
//you have data in dataMap
);
抱歉,由于我没有完整的信息,所以不确定结果,您需要修改代码。如果成功,请编辑我的答案。
仍然建议更改架构
希望这会有所帮助!
【讨论】:
感谢您的回复。对于嵌套的for循环,我是否需要在hashmap上创建一个for循环,然后为内部hashmap创建另一个循环?之后,我将结果哈希图添加/转换为数组列表。最后,我将数组列表放入 recyclerview 适配器以填充它。我的理解正确吗? 尝试在 Firebase 中实现您的架构后这是不可行的,您可以更改您的 Firestore 结构吗?它没有遵循正确的 JSON 格式,您应该使用我的建议或与您的架构/结构类似的东西 谢谢。我只是想知道,我想我可以在实时数据库中做到这一点。实时数据库可以嵌套多层。就像一个聊天室应用程序。我认为它在 Firestore 中应该是相似的。如果我误解了这部分,请纠正我。 在实时数据库中,您不必自己创建另一个集合,但在这里您必须完成该部分。Collection(mainCollection) ->Document(randomID) -> Collection (about) -> Document (IDs) = Data (name/district/image);
这是您在 firebase 中必须做的事情才能获得相同的结果。这可能看起来像一些额外的步骤,但这是为了更好
我通过制作情侣循环进行了试验。它会起作用吗?参考:***.com/questions/4234985/how-to-for-each-the-hashmap以上是关于从 Firestore 中检索嵌套对象并放入 Android 中的 RecyclerView?的主要内容,如果未能解决你的问题,请参考以下文章
在 AngularFire 中检索嵌套 Firestore 查询的 RxJS Observable
如何从 Cloud Firestore 上的对象中检索值?迅速