使用 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。正如您在那个问题中看到的那样,这是一个有争议的功能。
[FirebaseUI] has filtering as a deliberate non-goal, since we don't want to encourage greedily pulling data that may never be displayed.
我绝对担心在您的场景中检索到太多数据。最好提出一个允许在服务器上完成所需过滤的数据模型。
我正在开发一种论坛类型的应用程序,用户可以在其中 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。正如您在那个问题中看到的那样,这是一个有争议的功能。
[FirebaseUI] has filtering as a deliberate non-goal, since we don't want to encourage greedily pulling data that may never be displayed.
我绝对担心在您的场景中检索到太多数据。最好提出一个允许在服务器上完成所需过滤的数据模型。