【问题标题】:Offline sort of FirebaseRecyclerAdapter离线排序的 FirebaseRecyclerAdapter
【发布时间】:2016-11-08 11:15:34
【问题描述】:

我目前正在使用 FirebaseRecyclerAdapter 从 Firebase 数据库中检索数据,并且我已经非常了解如何按照我想要的顺序检索数据。

为了避免重复和简化数据库维护,我想向数据库条目添加一个键,以便我可以根据该键返回查询。我最初存储数据两次。一目了然,如果用户加入了某个组(在 groupName 下),则一次。

要返回基于组的查询,我的原始搜索如下:

databaseReference.child(groupName).child("exerciseId"+mExerciseId).orderByChild(sortOrder).limitToFirst(100);

但我相信通过在我的帖子中添加关键“组”可以避免重复。 (当用户切换组时,它也使维护变得更加容易)。

“组”数据库查询现在变为:

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);

【问题讨论】:

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


    【解决方案1】:

    FirebaseUI 库中的适配器目前始终按照底层FirebaseDatabase 引用或Query 返回的顺序显示数据。

    您可以为它提交feature request on the Github repo(因为我不确定它是否包含在this one 中)。或者,您可以 fork 库并自行实现此功能。

    【讨论】:

    • 感谢您的快速响应。它在没有简化的情况下工作,所以当我的 20 项其他项目完成后,我会回到它;-) 链式查询或链式排序标准是否在即将推出的 Firebase 功能列表中?最好显示前 100 个排行榜结果,然后将用户添加到列表中(如果尚未显示),或者在当前用户的任一侧显示 50 个。所有不错的增强功能,但不是必需的。再次感谢。
    • 我想再考虑一下,我可以根据单个查询填充我自己的列表,然后对其进行排序/添加,然后在回收视图中显示所有结果。不知道如何根据 Firebase 查询填充列表 - 我必须搜索,除非您有一个很好的示例的链接?
    【解决方案2】:

    反馈我想出的解决方案。我最终填充了我自己的列表,然后我可以根据我想要实现的目标对其进行排序或添加(如果使用多个查询)。然后使用标准的 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);
            }
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 2018-07-03
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      相关资源
      最近更新 更多