0

我目前正在使用FirebaseRecyclerAdapter從Firebase數據庫中檢索數據,並且我已經非常瞭解如何按照需要的順序檢索數據。脫機排序的FirebaseRecyclerAdapter

爲了避免重複和簡化數據庫維護,我想爲數據庫條目添加一個鍵,使我能夠根據該鍵返回查詢。我原本是存儲兩次數據。一次只供所有人查看,一次如果用戶加入某個組(在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); 
} 

我在帖子中實現媲美,問題出在哪裏存儲數據,這樣我可以在這種方式把它傳遞給Collections.sort() :

private List<Post> mPosts = new ArrayList<>(); 
mPosts.add(model); 

Collections.sort(mPosts, Post.Comparators.ALLTIME); 

回答

0

在FirebaseUI庫中的適配器目前始終在於它由基礎FirebaseDatabase參考或Query返回的順序顯示數據。

你可以爲它提交一個feature request on the Github repo(因爲我不確定它是否涵蓋在this one呢)。或者,您可以分叉庫並滾動您自己的這個功能的實現。

+0

感謝您的快速響應。它的工作沒有簡化,所以當我的其他20個項目完成時,我會回到它;-)在即將推出的Firebase功能列表中,鏈接查詢或鏈接排序標準是什麼?如果顯示排名前100的排行榜結果,然後將用戶添加到列表中(如果他們尚未顯示),或者顯示50當前用戶的任何一方,那就太好了。所有不錯的增強功能,但不是必需的。再次感謝。 –

+0

我猜想這可能更多,我可以基於單個查詢填充自己的List,然後對其進行排序/添加,然後在回收站查看所有結果。不知道我如何根據Firebase查詢填充列表 - 除非您有一個良好示例的鏈接,否則我將不得不進行搜索? –

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