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

Dav*_*vor 3 android firebase firebaseui google-cloud-firestore

我可以查询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
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果使用FirestoreRecyclerAdapter,它将自动将SomeEntity类反序列化为model对象。这一切都很好,但现在我需要将侦听器附加到列表中,并使用模型ID做出反应。现在,如果要手动从Firestore中反序列化对象,则可以执行以下操作:

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

但是,由于FirestoreRecyclerAdapter正在为我进行反序列化,所以我不敢document.getId()自欺欺人。到我使用onBindViewHolder方法时,我再也无法访问文档ID。有没有我缺少的方法,有什么方法可以从我忽略的适配器中检索ID?

注意,我不认为将ID冗余存储为字段是一种解决方案。我宁愿继承并重写FirestoreRecyclerAdapter,但是我更愿意在没有太多工作的情况下解决这个问题。

Fra*_*len 5

当您需要文档ID时,您应该已经知道要处理的项目。通常,这将是项目在列表中的位置。即,当用户点击某个项目时,点击处理程序会传递给该项目的ID。如果有position,则可以使用以下方法DataSnapshot从适配器获取:

adapter.getSnapshots().getSnapshot(position);
Run Code Online (Sandbox Code Playgroud)

因此,如果要获取ID,可以使用以下方法获取:

String id = adapter.getSnapshots().getSnapshot(position).getId();
Run Code Online (Sandbox Code Playgroud)