Android Firestore开发如何获取子集合中最新帖子的ID及description字段
问题根因
你现在的代码有三个核心错误:
- 你在post查询的成功回调里调用的
getSnapshots().getSnapshot(1),取的是外层FirestoreRecyclerAdapter绑定的「关注用户列表」的快照,根本不是你刚查询的用户帖子的结果,所以拿到的ID完全不对,自然查不到对应的description - 没有加排序规则,直接
limit(1)拿到的是Firestore默认按文档ID升序的第一个结果,不是最新发布的帖子 - 帖子集合路径拼写不一致:第一次查询用户帖子时用的是
post/前缀,后续单独查文档时用的是posts/前缀,路径不匹配也会导致查询不到数据
正确实现代码
你直接在post查询的回调里取task返回的结果即可,不需要额外再查一次,优化后的代码如下:
@Override protected void onBindViewHolder(@NonNull FindFriendsViewHolder findFriendsViewHolder, int i, @NonNull GetInfoPost getInfoPost) { final String listUserId = getSnapshots().getSnapshot(i).getId(); // 1. 按帖子发布时间倒序排序,取第一条就是最新帖子,注意把createTime换成你自己存的时间字段名 Query query = FirebaseFirestore.getInstance() .collection("post/" + listUserId + "/userPosts") .orderBy("createTime", Query.Direction.DESCENDING) // 必须加排序,按发布时间倒序 .limit(1); query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (!task.isSuccessful()) { // 异常处理,给描述设默认值 findFriendsViewHolder.txtDescrizione.setText("暂无动态"); return; } QuerySnapshot postSnapshot = task.getResult(); if (postSnapshot.isEmpty()) { // 该用户还没有发过帖子 findFriendsViewHolder.txtDescrizione.setText("暂无动态"); return; } // 2. 直接从当前查询的结果里取第一个文档,不需要二次查询 DocumentSnapshot latestPost = postSnapshot.getDocuments().get(0); String description = latestPost.getString("description"); findFriendsViewHolder.txtDescrizione.setText(description != null ? description : ""); } }); }
注意事项
- 代码里的
createTime是你存储帖子时记录的发布时间字段,需要替换成你自己项目里对应的字段名 - 现在的实现没有做列表滚动时的请求取消,快速滚动时可能会出现请求延迟导致的item内容错乱,建议给ViewHolder加请求tag,回收时取消未完成的请求
- 如果你需要同时展示多个帖子,建议改数据结构,把所有关注用户的最新帖子统一存在一个时间线集合里,避免每个item都发一次请求,减少性能消耗和数据库请求成本
内容的提问来源于stack exchange,提问作者Conta
相关产品推荐
相关产品推荐

