我可以查询 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
,但我宁愿如果我可以在没有那么多工作的情况下解决这个问题。
当您需要文档 ID 时,您应该已经知道有关您正在处理的项目的一些信息。通常,这将是项在列表中的位置。即,当用户单击某个项目时,单击处理程序将传递该项目的 ID。如果您有 position
,则可以通过以下方式从适配器获取DataSnapshot
:
adapter.getSnapshots().getSnapshot(position);
因此,如果您想获取 ID,您可以通过以下方式获取它:
String id = adapter.getSnapshots().getSnapshot(position).getId();
holder.itemView.setOnClickListener { v ->
Toast.makeText(v.context, snapshots.getSnapshot(position).id , Toast.LENGTH_SHORT).show()
}
这属于 BindviewHolder
在 OnBindViewHolder 中使用它
String DocID = Objects.requireNonNull (getCurrentList ()).snapshot ().get (position).getId ();
如果您使用的是项目.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();
}