如何在 Android 中使用带有动态引用的 FirebaseRecyclerAdapter?
How to use a FirebaseRecyclerAdapter with a dynamic reference in Android?
我知道如何在 Firebase 的项目列表中使用 FirebaseRecyclerAdapter
。我也知道如何使用索引从多个位置获取 Firebase 数据。但我不知道如何将其与 FirebaseRecyclerAdapter 结合使用。
我有一个简单的数据结构,用户可以成为朋友:
"users": {
"user1": {
"name": "name",
"friends": {
"user2": "true"
}
}
"user2": {
"name": "name",
"friends": {
"user1": "true"
}
}
}
我为用户名使用唯一 ID。在这个简单的例子中,用户 1 和用户 2 是朋友。我想要做的是使用 FirebaseRecyclerAdapter 获取所有名称(以及以后可能更多)的列表。通常,我会通过获取 "friends" 下的用户 ID,然后使用这些 ID 导航到他们的姓名来获得列表。在 Java 中,它看起来像这样:
Firebase ref = new Firebase("<reference>");
ref.child("users/user1/friends").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
String userId = snapshot.getKey();
ref.child("users/" + userId + "/name").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
System.out.println(snapshot.getValue());
}
@Override
public void onCancelled(FirebaseError firebaseError) {
// Do something here
}
});
}
});
但是当使用 FirebaseRecyclerAdapter 时,您只能定义一个 URL。适配器将根据那个地方的项目制作一个列表。
有没有办法调整适配器,使其从多个地方读取数据,就像上面的例子一样?
或者有没有办法制作一个动态引用变量,该变量仅指向也存储在当前用户 "friends" 列表中的用户 ID?我正在考虑使用 equals() 方法,但我不知道具体如何。
另一种方法是将用户名也存储在 "friends" 列表中。但这不会改善数据结构。我每次都必须在两个地方更改名称(也许稍后会更改照片),这会引入更多冗余。
有人能解决这个问题吗?我在任何地方都找不到答案,但这似乎是一种常见的模式。除了让它发挥作用之外,我该如何有效地做到这一点?
您需要通过附加 addListenerForSingleValueEvent()
来加入数据。
FirebaseRecyclerViewAdapter<Boolean, ItemViewHolder> adapter = new FirebaseRecyclerViewAdapter<Boolean, ItemViewHolder>(
Boolean.class, android.R.layout.two_line_list_item, ItemViewHolder.class, friendsRef){
protected void populateViewHolder(final ItemViewHolder viewHolder, Boolean model, int position) {
String key = this.getRef(position).getKey();
ref.child("users").child(key).addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
String name = dataSnapshot.child("name").getValue(String.class);
((TextView)viewHolder.itemView.findViewById(android.R.id.text1)).setText(name);
}
public void onCancelled(FirebaseError firebaseError) { }
});
}
};
我添加了一个 activity Activity36235919
to demonstrate this to my sample repo。
使它生效后,我意识到我之前在 中回答过这个问题,所以我将把你的问题标记为重复。
我知道如何在 Firebase 的项目列表中使用 FirebaseRecyclerAdapter
。我也知道如何使用索引从多个位置获取 Firebase 数据。但我不知道如何将其与 FirebaseRecyclerAdapter 结合使用。
我有一个简单的数据结构,用户可以成为朋友:
"users": {
"user1": {
"name": "name",
"friends": {
"user2": "true"
}
}
"user2": {
"name": "name",
"friends": {
"user1": "true"
}
}
}
我为用户名使用唯一 ID。在这个简单的例子中,用户 1 和用户 2 是朋友。我想要做的是使用 FirebaseRecyclerAdapter 获取所有名称(以及以后可能更多)的列表。通常,我会通过获取 "friends" 下的用户 ID,然后使用这些 ID 导航到他们的姓名来获得列表。在 Java 中,它看起来像这样:
Firebase ref = new Firebase("<reference>");
ref.child("users/user1/friends").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
String userId = snapshot.getKey();
ref.child("users/" + userId + "/name").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
System.out.println(snapshot.getValue());
}
@Override
public void onCancelled(FirebaseError firebaseError) {
// Do something here
}
});
}
});
但是当使用 FirebaseRecyclerAdapter 时,您只能定义一个 URL。适配器将根据那个地方的项目制作一个列表。
有没有办法调整适配器,使其从多个地方读取数据,就像上面的例子一样? 或者有没有办法制作一个动态引用变量,该变量仅指向也存储在当前用户 "friends" 列表中的用户 ID?我正在考虑使用 equals() 方法,但我不知道具体如何。
另一种方法是将用户名也存储在 "friends" 列表中。但这不会改善数据结构。我每次都必须在两个地方更改名称(也许稍后会更改照片),这会引入更多冗余。
有人能解决这个问题吗?我在任何地方都找不到答案,但这似乎是一种常见的模式。除了让它发挥作用之外,我该如何有效地做到这一点?
您需要通过附加 addListenerForSingleValueEvent()
来加入数据。
FirebaseRecyclerViewAdapter<Boolean, ItemViewHolder> adapter = new FirebaseRecyclerViewAdapter<Boolean, ItemViewHolder>(
Boolean.class, android.R.layout.two_line_list_item, ItemViewHolder.class, friendsRef){
protected void populateViewHolder(final ItemViewHolder viewHolder, Boolean model, int position) {
String key = this.getRef(position).getKey();
ref.child("users").child(key).addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
String name = dataSnapshot.child("name").getValue(String.class);
((TextView)viewHolder.itemView.findViewById(android.R.id.text1)).setText(name);
}
public void onCancelled(FirebaseError firebaseError) { }
});
}
};
我添加了一个 activity Activity36235919
to demonstrate this to my sample repo。
使它生效后,我意识到我之前在