有没有办法从FirestoreRecyclerAdapter获取项目的文档ID?

时间:2018-04-07 14:06:04

标签: android firebase google-cloud-firestore firebaseui

我可以手动查询Firestore并获取ID,但我使用FirestoreRecyclerAdapter,因为它带来了大量额外的工作。所以,如果我有这样的代码:

FirebaseFirestore db = FirebaseFirestore.getInstance();

Query query = db.collection(COLLECTION_NAME)
        .whereEqualTo("userId", USER_ID)
        .limit(LIMIT);

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

FirestoreRecyclerAdapter adapter = new FirestoreRecyclerAdapter<SomeEntity, MyHolder>(options) {
    @Override
    public void onBindViewHolder(MyHolder holder, int position, SomeEntity model) {
        // I need model ID here
    }
}

因此,如果我使用FirestoreRecyclerAdapter,它会自动将我的SomeEntity类反序列化为model对象。这一切都很好,但现在我需要将监听器附加到列表中,并对模型ID做出反应。现在,如果我从Firestore手动反序列化对象,我会做这样的事情:

for (DocumentSnapshot document : task.getResult()) {
    SomeEntity entity = document.toObject(SomeEntity.class).setId(document.getId());
    list.add(entity);
}

但是,由于FirestoreRecyclerAdapter正在为我做反序列化,我自己也无法致电document.getId()。当我使用onBindViewHolder方法时,我无法再访问文档ID了。是否有一些我缺少的方法,某些方法可以从我忽略的适配器中检索ID?

注意,我不认为将ID作为字段冗余存储为解决方案。我宁愿继承并覆盖FirestoreRecyclerAdapter,但我更愿意,如果我能在没有那么多工作的情况下解决这个问题。

4 个答案:

答案 0 :(得分:5)

当您需要文档ID时,您应该已经了解了您正在处理的项目。通常,这将是列表中项目的位置。即当用户单击某个项目时,单击处理程序将传递该项目的ID。如果您拥有position,则可以通过以下方式从适配器获取DataSnapshot

adapter.getSnapshots().getSnapshot(position);

因此,如果您想获取ID,请通过以下方式获取:

String id = adapter.getSnapshots().getSnapshot(position).getId();

答案 1 :(得分:0)

这很愚蠢,但是我在阅读this comment.

后将文档ID作为文档保存在字段中

答案 2 :(得分:0)

holder.itemView.setOnClickListener { v ->
            Toast.makeText(v.context, snapshots.getSnapshot(position).id , Toast.LENGTH_SHORT).show()

        }

这属于 BindviewHolder

答案 3 :(得分:0)

在 OnBindViewHolder 中使用它

String DocID = Objects.requireNonNull (getCurrentList ()).snapshot ().get (position).getId ();

如果您使用的是 items.class,您可以使用 getter 和 @DocumentID 创建一个字符串。

private String docID; 

@DocumentId
public String getDocID() {
return docID;
}

然后在 onBindViewHolder 中调用这个

protected void onBindViewHolder(@NonNull @NotNull ViewHolder holder, int position, @NonNull @NotNull Items model) {
model.getDocId();
}