我目前正在使用FirebaseRecyclerAdapter从Firebase数据库中检索数据,而且我已经解决了如何按照我想要的顺序检索数据的问题。
为了避免重复并简化数据库维护,我想在数据库条目中添加一个密钥,允许我根据该密钥返回查询。我最初存储数据两次。一旦有人看到,一旦用户加入某个组(在groupName下)。
要根据群组返回查询,我的原始搜索结果如下:
databaseReference.child(groupName).child("exerciseId"+mExerciseId).orderByChild(sortOrder).limitToFirst(100);
但我相信可以通过添加密钥" group"来避免重复。到我的帖子。 (当用户切换组时,它也使维护更容易)。
"组"数据库查询现在变成了:
databaseReference.child("exerciseId"+mExerciseId).orderByChild("group").equalTo(groupName);
一切都很好,除了数据不再按照" sortOrder"进行排序。由于firebase不允许多种排序标准,我相信我的解决方案在于离线排序。
那么,如何对适配器进行脱机排序?
我的适配器很标准:
mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(Post.class, R.layout.item_post, PostViewHolder.class, dataQuery)
{
@Override
protected void populateViewHolder(final PostViewHolder viewHolder, final Post model, final int position)
{
final DatabaseReference postRef = getRef(position);
// Bind Post to ViewHolder, setting OnClickListener for the star button
viewHolder.bindToPost(model, position, postRef.getKey(), null);
}
mRecycler.setAdapter(mAdapter);
}
我在Post中实现了Comparable,问题在于存储数据的位置,以便我可以通过以下方式将其传递给Collections.sort():
private List<Post> mPosts = new ArrayList<>();
mPosts.add(model);
Collections.sort(mPosts, Post.Comparators.ALLTIME);
答案 0 :(得分:0)
FirebaseUI库中的适配器当前始终按基础FirebaseDatabase
引用或Query
返回的顺序显示数据。
您可以为其提交feature request on the Github repo(因为我还不确定它是否已涵盖在this one中)。或者,您可以分叉库并推出自己的此功能实现。
答案 1 :(得分:0)
对于我提出的解决方案的反馈意见。我最终填充了我自己的List,然后我可以根据我想要实现的内容对其进行排序或添加(如果使用多个查询)。然后使用标准的RecyclerView适配器显示。它很棒。
private final List<Post> postList = new ArrayList<>();
dataQuery.addListenerForSingleValueEvent(new ValueEventListener()
{
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
postList.clear(); // in this example it's a newQuery, so clear postList
for (DataSnapshot child : dataSnapshot.getChildren())
{
Post post = child.getValue(Post.class);
postList.add(post);
int myPosition = sortData(); // uses Collections.sort() to sort data
mAdapter.addPosts(postList);
mAdapter.notifyDataSetChanged();
mRecycler.scrollToPosition(myPosition);
}
}
});