如何在Android中使用带有动态参考的FirebaseRecyclerAdapter?

Tom*_*Kok 7 android firebase firebase-realtime-database

我知道如何使用FirebaseRecyclerAdapterFirebase中的项目列表.我也知道如何使用索引从多个位置获取Firebase数据.但我不知道如何将其与FirebaseRecyclerAdapter结合使用.

我有一个简单的数据结构,用户可以成为朋友:

"users": {
  "user1": {
    "name": "name",
    "friends": {
      "user2": "true"
      }
    }
  "user2": {
    "name": "name",
    "friends": {
      "user1": "true"
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

我为用户名使用唯一ID.在这个简单的例子中,用户1和用户2是朋友.我想要做的是使用FirebaseRecyclerAdapter获取所有名称的列表(以及稍后可能更多).通常,我会通过获取"朋友"下的用户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
      }
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

但是在使用FirebaseRecyclerAdapter时,您只能定义一个URL.适配器将根据单个位置中的项目创建列表.

有没有办法调整适配器,以便从多个位置读取数据,就像上面的例子一样?或者有没有办法制作一个动态ref变量,它只指向同时存储在当前用户"朋友"列表中的用户ID?我正在考虑使用equals()方法,但我无法弄清楚究竟如何.

另一种方法是将用户名也存储在"朋友"列表中.但这不会改善数据结构.我每次都必须在两个地方更改名称(也许是后来的照片),这会引入更多的冗余.

有没有人有解决这个问题的方法?我无法在任何地方找到答案,但它似乎是一种常见的模式.除了让它工作之外,我该如何有效地做到这一点?

Fra*_*len 11

您需要通过附加一个来加入数据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) { }
        });
    }
};
Run Code Online (Sandbox Code Playgroud)

我添加了一个活动Activity36235919向我的样品仓库证明这一点.

在实现它之后,我意识到我之前在将FirebaseRecyclerViewAdapter耦合到布尔/字符串Map.Entry时已经回答了这个问题,因此我将您的问题标记为重复.


归档时间:

查看次数:

11163 次

最近记录:

8 年,3 月 前