【问题标题】:How to use use Firestore document field's HashMap key value and populate recyclerview?如何使用使用 Firestore 文档字段的 HashMap 键值并填充 recyclerview?
【发布时间】:2021-12-11 07:50:31
【问题描述】:

我刚开始学习安卓。我想知道一种方法,我可以使用仅包含 HashMap 键和值的 firebase 文档字段填充 RecyclerView。对不起,如果我问错了问题。我只想知道有没有可能?this is the snapshot of my firebase

请注意- 我知道如何将项目(我存储在地图中)作为单独的文档存储在集合中并制作 RecyclerView。目前,我仅使用此方法并填充 RecyclerView。但我不想将这些项目存储为单独的文档。

这是所需的输出...Required reyclerview

public class ModelTrans{
    Double RecentAmount;
    String TransText;
    String Transactionid;
    @ServerTimestamp
    Date date;
    int img;

    public ModelTrans() {
    }

    public ModelTrans(Double recentAmount, String transText, String transactionid, Date date, int img) {
        RecentAmount = recentAmount;
        Transtext = transText;
        Transactionid = transactionid;
        this.date = date;
        this.img = img;
    }

......other getter setters

}

【问题讨论】:

  • 是的,这是可能的。你都尝试了些什么?你用的是 Java 还是 Kotlin?
  • @AlexMamo 我正在使用 java....但我不想创建单独的文档,因为读取的文档成本很高。
  • 好的,我马上给你写答案。

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


【解决方案1】:

既然您说您已将这些对象添加到集合中并且它起作用了,那么您也可以在文档中执行相同的操作。您需要做的是创建一个指向该特定文档的引用,然后阅读它。

文档的每个字段都是ModelTrans 类型的对象。要获取该数据,您应该使用以下代码行:

joinedContestRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                List<ModelTrans> transList = new ArrayList<>();
                Map<String, Object> map = document.getData();
                for(Map.Entry<String, Integer> entry : map.entrySet()) {
                    String key = entry.getKey();
                    Map<String, Object> value = (Map<String, Object>) entry.getValue();
                    //Iterate again and add the data to a transList.
                }
            } else {
                Log.d(TAG, "No such document");
            }
        } else {
            Log.d(TAG, "get failed with ", task.getException());
        }
    }
});

如您所见,我使用了 DocumentSnapshot#getData() 方法,该方法返回 Map 类型的对象。您现在要做的就是遍历地图并获取其中的数据。您实际上只需要这些值。最后,只需将这些值添加到列表中,然后将该列表传递给适配器。差不多就这些了。

编辑:

您的评论很好。我应该从一开始就添加它。

是的,您可以将多少数据放入单个文档中是有一些限制的。根据usage and limits的官方文档:

文档的最大大小:1 MiB(1,048,576 字节)

如您所见,单个文档中的数据总量限制为 1 MiB。所以请注意这个限制,否则,您的写入可能会开始失败。

【讨论】:

  • 我想知道我的文档“JoinedContest”可以容纳多少项目?我假设文档中提到的“JoinedContest”中映射的最大条目将是 700 到 1000。那么这是以映射键值方式存储项目的好方法还是每个项目都应该存储在单独的文档中?
  • 好点。请参阅我更新的答案。现在可以了吗?
  • 感谢@Alexmamo 的回答..1 我想问的最后一件事..你能给我一个链接,假设在这种情况下我有 500 张地图......但我只想展示top 10 ,然后在用户滚动后,将从 firestore 读取下一个 10 并加载..再下一个 10...
  • Firestore 中的分页仅适用于集合中存在的文档。如果您需要对来自单个文档的元素进行分页,换句话说,对 ModelTrans 对象的列表进行分页,那么您应该自己实现该算法。
  • 嘿亚历克斯..在 Map map = document.getData(); 行之后我没有任何想法那么我如何在recyclerview中填充数据..我已经迭代了数据......但是下一步是什么?基本上我无法做到这一点,你在答案中所说的......In the end, simply add those values to a List, and then pass that List to an adapter请帮助alex..
猜你喜欢
  • 2020-07-13
  • 2018-08-20
  • 2020-02-19
  • 1970-01-01
  • 2023-02-10
  • 2020-11-21
  • 1970-01-01
  • 2018-09-26
  • 2020-08-19
相关资源
最近更新 更多