如何在 FirestorePagingAdapter 中获取文档 ID?
How to get document id in In FirestorePagingAdapter?
我正在尝试使用 FirestorePagingAdapter
显示我的 firestore 数据库中所有用户的列表。我使用 FirestorePagingAdapter
而不是 FirestoreRecyclerAdapter 来最小化读取次数,因为 FirestorePagingAdapter
不会读取整个文档列表,而 FirestoreRecyclerAdapter
会读取。我能够成功显示分页列表,但我需要在其上实现 onClickListener
,并且在单击每个项目时,我需要打开另一个 activity,它显示了被单击的特定用户的详细描述.为此,我需要将被点击用户的documentId传递给下一个activity。
但不幸的是,FirestorePagingAdapter 没有 getSnapshots() 方法,所以我使用 getSnapshots().getSnapshot(position).getId().
另一方面,FirestoreRecyclerAdapter 具有此方法,这使得获取文档 ID 成为一项非常容易的任务。像这样:
// Query to fetch documents from user collection ordered by name
Query query = FirebaseFirestore.getInstance().collection("users")
.orderBy("name");
// Setting the pagination configuration
PagedList.Config config = new PagedList.Config.Builder()
.setEnablePlaceholders(false)
.setPrefetchDistance(10)
.setPageSize(20)
.build();
FirestorePagingOptions<User> firestorePagingOptions = new FirestorePagingOptions.Builder<User>()
.setLifecycleOwner(this)
.setQuery(query, config, User.class)
.build();
firestorePagingAdapter =
new FirestorePagingAdapter<User, UserViewHolder>(firestorePagingOptions){
@NonNull
@Override
public UserViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.single_user_layout, parent, false);
return new UserViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull UserViewHolder holder, int position, @NonNull User user) {
holder.setUserName(user.name);
holder.setStatus(user.status);
holder.setThumbImage(user.thumb_image, UsersActivity.this);
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent userProfileIntent = new Intent(UsersActivity.this, UserProfileActivity.class);
// Need to fetch the user_id to pass it as intent extra
// String user_id = getSnapshots().getSnapshot(position).getId();
// userProfileIntent.putExtra("user_id", user_id);
startActivity(userProfileIntent);
}
});
}
};
正如您已经注意到的那样:
String id = getSnapshots().getSnapshot(position).getId();
不起作用,只有在使用FirestoreRecyclerAdapter
时才起作用。因此,要解决此问题,您需要将文档的 id 存储为文档的 属性。如果文档的 ID 是来自 Firebase 验证的用户 ID,则只需存储 uid
。如果您不使用 uid
,则在创建新对象时获取文档的 ID 并将其传递给 User
构造函数,如下所示:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference usersRef = rootRef.collection("users");
String id = eventsRef.document().getId();
User user = new User(id, name, status, thumb_image);
usersRef.document(id).set(user);
我能够通过在 setQuery
方法中使用 SnapshotParser
来做到这一点。通过这个,我能够修改从 firestore 获得的对象。 documentSnapshot.getId()
方法returns文档id。
FirestorePagingOptions<User> firestorePagingOptions = new FirestorePagingOptions.Builder<User>()
.setLifecycleOwner(this)
.setQuery(query, config, new SnapshotParser<User>() {
@NonNull
@Override
public User parseSnapshot(@NonNull DocumentSnapshot snapshot) {
User user = snapshot.toObject(User.class);
user.userId = snapshot.getId();
return user;
}
})
.build();
在用户 class 中,我刚刚在用户 class 中添加了另一个字段 "String userId"。我的 firestore 文档中不存在 userId 字段。
在onClickListener
中,我可以直接使用user.userId
获取文档id并将其发送给其他activity。
试试这个
getSnapshots().getSnapshot(position).getId()
我花了一天时间试图获取文档的 ID,因为我现在正在使用 FirestorePagingAdapter。对于 Kotlin,这对我有用
override fun onBindViewHolder(viewHolder: LyricViewHolder, position: Int, song: Lyric) {
// Bind to ViewHolder
viewHolder.bind(song)
viewHolder.itemView.setOnClickListener { view ->
val id = getItem(position)?.id
var bundle = bundleOf("id" to id)
view.findNavController().navigate(R.id.songDetailFragment, bundle)
}
}
希望这在不久的将来对其他人有所帮助。如果有人感到困惑,可以 post 完整的代码和完整的解释。编码愉快!
在尝试从 itemView 访问文档快照时,我发现 this
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int pos = getAdapterPosition();
if (pos != RecyclerView.NO_POSITION && listener != null) {
String docId = getItem(pos).getId();
Toast.makeText(context, "doc Id: "+docId, Toast.LENGTH_SHORT).show();
//listener.onItemClick(getSnapshots().getSnapshot(pos), pos, docId);
listener.onItemClick(getItem(pos), pos, docId);
}
}
});
如前所述 here,getItem()
returns 项目的数据对象。
我正在尝试使用 FirestorePagingAdapter
显示我的 firestore 数据库中所有用户的列表。我使用 FirestorePagingAdapter
而不是 FirestoreRecyclerAdapter 来最小化读取次数,因为 FirestorePagingAdapter
不会读取整个文档列表,而 FirestoreRecyclerAdapter
会读取。我能够成功显示分页列表,但我需要在其上实现 onClickListener
,并且在单击每个项目时,我需要打开另一个 activity,它显示了被单击的特定用户的详细描述.为此,我需要将被点击用户的documentId传递给下一个activity。
但不幸的是,FirestorePagingAdapter 没有 getSnapshots() 方法,所以我使用 getSnapshots().getSnapshot(position).getId().
另一方面,FirestoreRecyclerAdapter 具有此方法,这使得获取文档 ID 成为一项非常容易的任务。像这样:
// Query to fetch documents from user collection ordered by name
Query query = FirebaseFirestore.getInstance().collection("users")
.orderBy("name");
// Setting the pagination configuration
PagedList.Config config = new PagedList.Config.Builder()
.setEnablePlaceholders(false)
.setPrefetchDistance(10)
.setPageSize(20)
.build();
FirestorePagingOptions<User> firestorePagingOptions = new FirestorePagingOptions.Builder<User>()
.setLifecycleOwner(this)
.setQuery(query, config, User.class)
.build();
firestorePagingAdapter =
new FirestorePagingAdapter<User, UserViewHolder>(firestorePagingOptions){
@NonNull
@Override
public UserViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.single_user_layout, parent, false);
return new UserViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull UserViewHolder holder, int position, @NonNull User user) {
holder.setUserName(user.name);
holder.setStatus(user.status);
holder.setThumbImage(user.thumb_image, UsersActivity.this);
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent userProfileIntent = new Intent(UsersActivity.this, UserProfileActivity.class);
// Need to fetch the user_id to pass it as intent extra
// String user_id = getSnapshots().getSnapshot(position).getId();
// userProfileIntent.putExtra("user_id", user_id);
startActivity(userProfileIntent);
}
});
}
};
正如您已经注意到的那样:
String id = getSnapshots().getSnapshot(position).getId();
不起作用,只有在使用FirestoreRecyclerAdapter
时才起作用。因此,要解决此问题,您需要将文档的 id 存储为文档的 属性。如果文档的 ID 是来自 Firebase 验证的用户 ID,则只需存储 uid
。如果您不使用 uid
,则在创建新对象时获取文档的 ID 并将其传递给 User
构造函数,如下所示:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference usersRef = rootRef.collection("users");
String id = eventsRef.document().getId();
User user = new User(id, name, status, thumb_image);
usersRef.document(id).set(user);
我能够通过在 setQuery
方法中使用 SnapshotParser
来做到这一点。通过这个,我能够修改从 firestore 获得的对象。 documentSnapshot.getId()
方法returns文档id。
FirestorePagingOptions<User> firestorePagingOptions = new FirestorePagingOptions.Builder<User>()
.setLifecycleOwner(this)
.setQuery(query, config, new SnapshotParser<User>() {
@NonNull
@Override
public User parseSnapshot(@NonNull DocumentSnapshot snapshot) {
User user = snapshot.toObject(User.class);
user.userId = snapshot.getId();
return user;
}
})
.build();
在用户 class 中,我刚刚在用户 class 中添加了另一个字段 "String userId"。我的 firestore 文档中不存在 userId 字段。
在onClickListener
中,我可以直接使用user.userId
获取文档id并将其发送给其他activity。
试试这个
getSnapshots().getSnapshot(position).getId()
我花了一天时间试图获取文档的 ID,因为我现在正在使用 FirestorePagingAdapter。对于 Kotlin,这对我有用
override fun onBindViewHolder(viewHolder: LyricViewHolder, position: Int, song: Lyric) {
// Bind to ViewHolder
viewHolder.bind(song)
viewHolder.itemView.setOnClickListener { view ->
val id = getItem(position)?.id
var bundle = bundleOf("id" to id)
view.findNavController().navigate(R.id.songDetailFragment, bundle)
}
}
希望这在不久的将来对其他人有所帮助。如果有人感到困惑,可以 post 完整的代码和完整的解释。编码愉快!
在尝试从 itemView 访问文档快照时,我发现 this
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int pos = getAdapterPosition();
if (pos != RecyclerView.NO_POSITION && listener != null) {
String docId = getItem(pos).getId();
Toast.makeText(context, "doc Id: "+docId, Toast.LENGTH_SHORT).show();
//listener.onItemClick(getSnapshots().getSnapshot(pos), pos, docId);
listener.onItemClick(getItem(pos), pos, docId);
}
}
});
如前所述 here,getItem()
returns 项目的数据对象。