使用 parseSnapshot(DataSnapshot snapshot) 根据子键过滤要填充到 RecyclerView 中的项目

Filtering items to populate in RecyclerView based on a child key using parseSnapshot(DataSnapshot snapshot)

我正在开发一种论坛类型的应用程序,用户可以在其中 post 提问并用相关技术标记它们。

该应用程序具有类似于 Firebase database repo 的模块和数据库。

我想根据标签过滤 post。由于无法在服务器端对多个键值进行过滤,因此在填充到 RecyclerView 之前,我不得不想办法对其进行过滤。

我在这里参考了很多问题,发现 Puf 的 与这个案例相关。

这是我的 JSON 树

"posts" : {
"-Kdb0BsybfpPtkAPRF1-" : {
  "author" : "Anush Surendran",
  "body" : "Test 1 ",
  "commentCount" : 0,
  "created" : 1487787053303,
  "starCount" : 1,
  "stars" : {
    "v9KTwyI2DMbDgKHALgPSJEBK3fi1" : true
  },
  "tag" : "#CSS",
  "title" : "Checking Post Time",
  "uid" : "BvNgX2U5U4SriTWsoEtqbGYgOTw1"
},
"-Kdb2D9vD-3kHWpCMIFi" : {
  "author" : "Anush Surendran",
  "body" : "Abc",
  "commentCount" : 0,
  "created" : 1485000000000,
  "starCount" : 0,
  "tag" : "#HTML",
  "title" : "Test 2",
  "uid" : "BvNgX2U5U4SriTWsoEtqbGYgOTw1"
}

我正在使用以下逻辑覆盖 parseSnapshot

    @Override
    protected Post parseSnapshot(DataSnapshot snapshot) {
        if (snapshot.getValue(Post.class).tag.equals("#HTML")){
            Log.d(TAG,"gotHTML Filtered Posts");
            return snapshot.getValue(Post.class);
        }
        else
        return super.parseSnapshot(snapshot);
    }

现在只用一个值试试。我将把它放在一个循环中以过滤多个标签(比如 HTML、CSS、JS)

代码工作正常,我可以看到 if 条件按预期工作。

如果没有带有特定标签的 post,我不知道在 else 部分要 return 什么。 当前的 else 部分return 都是 post。

有没有比这更好的过滤数据的方法?

如有任何帮助,我们将不胜感激!

您可以从 firebase 获取过滤后的数据,而不是在客户端获取所有数据并进行过滤。

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
Query postsQuery = mDatabase.child("posts").orderByChild("tag").equalTo("#HTML");
mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(Post.class, R.layout.item_post, PostViewHolder.class, postsQuery) {
            @Override
            protected void populateViewHolder(final PostViewHolder viewHolder, final Post model, final int position) {
                final DatabaseReference yourRef = getRef(position);
                viewHolder.bindToPost(model,getContext());

            }
        };
        mRecycler.setAdapter(mAdapter);

覆盖 parseSnapshot 可用于将视图映射到快照中的数据子集。如果不能用于过滤数据。

目前无法使用 FirebaseUI 在客户端上过滤数据。有一个开放的功能请求:https://github.com/firebase/FirebaseUI-Android/issues/15。正如您在那个问题中看到的那样,这是一个有争议的功能。

作为Morgan says there

[FirebaseUI] has filtering as a deliberate non-goal, since we don't want to encourage greedily pulling data that may never be displayed.

我绝对担心在您的场景中检索到太多数据。最好提出一个允许在服务器上完成所需过滤的数据模型。