离线排序的FirebaseRecyclerAdapter

时间:2016-11-08 11:15:34

标签: android android-recyclerview firebase-realtime-database firebaseui

我目前正在使用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);

2 个答案:

答案 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);
        }
    }
});