如何在 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

使它生效后,我意识到我之前在 中回答过这个问题,所以我将把你的问题标记为重复。