【问题标题】:Android - Multiple queries for recyclerview (Firebase)Android - recyclerview (Firebase) 的多个查询
【发布时间】:2017-11-07 10:50:35
【问题描述】:

我正在使用 recylerviews 和 Firebase。我正在使用 FirebaseUI 将数据填充到我的 recyclerview 中。我想知道是否可以在我的片段中使用两个查询。应该执行的查询应该取决于数据库中是否存在节点。

数据库结构:

如果 address 子节点存在于 users 节点中,我的片段应该查询 users 节点。如果不是,它应该查询路由节点。这可能吗?

基本上我在这里通过查询获取所有标记:

Query keyQuery = FirebaseDatabase.getInstance().getReference(sharedPreferences.getString("school", null)).child("markers");
    recyclerView = (RecyclerView) rootView.findViewById(R.id.markerRecyclerview);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    FirebaseRecyclerOptions<FirebaseMarker> options = new FirebaseRecyclerOptions.Builder<FirebaseMarker>()
            .setQuery(keyQuery, FirebaseMarker.class)
            .build();

在我的 onBindViewHolder 方法中,我在 recyclerview 中的每个项目上都有一个 onClick。单击该项目时,用户将转到一个新活动。在这个新活动中,用户可以按下一个按钮,该按钮将在 users/userId 节点下添加地址节点。按下那个按钮意味着用户已经选择了那个标记。所以我只想在 recyclerview 中显示标记信息,而不是在数据库中显示每个标记。

 holder.mView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(getActivity(),MainActivity.class);
                    intent.putExtra("databaseKey", key);
                    startActivity(intent);
                }
            });

我在想:如果在 users 节点中插入 addresstime 节点,我可以直接查询它,这样会更容易。

【问题讨论】:

  • 那么,您想根据address 是否存在于当前用户的节点下,将不同的查询附加到FirebaseRecyclerAdapter?您能否提供一些示例代码来说明这种情况会发生在哪里?您应该能够使用不同的 FirebaseRecyclerOptions 实例初始化适配器。
  • 我更新了我的帖子。有意义吗?
  • 你认为有可能吗?

标签: android firebase firebase-realtime-database


【解决方案1】:

这是可能的,尽管我认为您首先需要检查用户是否选择了标记,然后决定将哪个查询附加到FirebaseRecyclerAdapter

为此,可能需要在标记节点下添加已选择每个标记的用户列表,例如:

users
  userId
    selectedMarker      // the ID of the marker selected by this user
    ...
markers
  markerId
    ...
    selectedUsers       // list of user IDs that have selected this marker

然后,如果 users 节点包含 selectedMarker 值,您可以使用以下查询来获取该特定用户选择的所有标记:

Query query = FirebaseDatabase.getInstance().getReference()
        .child(schoolId).child("markers")
        .orderByChild("selectedUsers/"+userId).equalTo(true);

其中schoolId 来自您的sharedPreferences.getString("school", null)userId 是当前登录用户的唯一 ID。

要检查用户是否选择了标记,可以很简单:

FirebaseDatabase.getInstance().getReference()
        .child(schoolId).child("users").child(userId)
        .addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.child("selectedMarker").exists()) {
                    // Attach above query to FirebaseRecyclerAdapter
                } else {
                    // Attach markers reference (no query) to FirebaseRecyclerAdapter
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {}
        });

但是,如果您只想显示用户的单个选定标记,则可能根本不需要使用 RecyclerView,而可以只使用单独的视图来显示有关用户选定标记的详细信息。

【讨论】:

  • 感谢您的回答。看来您的最后一点是正确的,因为我只需要显示用户的单个选定标记。我想使用recylerview 来显示所有标记,如果address 节点存在于用户节点下,则只是一个单独的文本视图
  • 我遇到的问题是,在if-else 语句中运行databaseReference 时,它​​没有正确执行。
  • pastebin.com/Ks0c0LJT。我就是这样做的。我是否犯了任何错误。我的屏幕只显示一个没有数据的填充行。
  • 看起来不错,但您需要记住onDataChange() 是异步的,因此如果您还没有调用此块中的FirebaseRecyclerOptions 设置代码,则需要调用此代码。
  • else statement 内?都是用同一个方法完成的
猜你喜欢
  • 1970-01-01
  • 2021-10-05
  • 2017-04-23
  • 1970-01-01
  • 2017-07-31
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多