2016-11-02 26 views
2

我正在使用Android上的Firebase構建應用程序。我的應用場景如下。看看下面的屏幕。Android - 使用FirebaseRecyclerAdapter進行客戶端排序

Transactions screen

正如你所看到的,上面的畫面,我顯示基於用戶角色事務列表:租賃者和所有者。此外,在工具欄中,用戶可以輕鬆過濾任何事務狀態,如下面的屏幕所示。

Transaction status filter

爲了實現這個場景,我模仿我的數據庫結構如下:

- transactionsAll: 
    - transactionID1: 
     - orderDate: xxx 
     - role: Renter/Owner 
    - transactionID2: 
     .... 
- transactionsWaitingApproval: 
    - transactionID1: 
     - orderDate: xxx 
     - role: Renter/Owner 

的事情是,在每一個片段的,我用的orderByChild查詢只顯示基於每個片段的用戶角色交易的名單,無論是承租人或所有者,像這樣

public void refreshRecyclerView(final String transactionStatus) { 
    Query transactionsQuery = getQuery(transactionStatus); 
    //Clean up old data 
    if (mFirebaseRecyclerAdapter != null) { 
     mFirebaseRecyclerAdapter.cleanup(); 
    } 

    mFirebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Transaction, TransactionViewHolder>(Transaction.class, R.layout.item_transaction, 
      TransactionViewHolder.class, transactionsQuery) { 

     @Override 
     public int getItemCount() { 
      int itemCount = super.getItemCount(); 

      if (itemCount == 0) { 
       mRecyclerView.setVisibility(View.GONE); 
       mEmptyView.setVisibility(View.VISIBLE); 
      } else { 
       mRecyclerView.setVisibility(View.VISIBLE); 
       mEmptyView.setVisibility(View.GONE); 
      } 

      return itemCount; 
     } 

     @Override 
     protected void populateViewHolder(final TransactionViewHolder viewHolder, final Transaction transaction, final int position) { 

      final CardView cardView = (CardView) viewHolder.itemView.findViewById(R.id.transactionCardView); 
      cardView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

       } 
      }); 

      viewHolder.bindToPost(getActivity(), transaction, new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
       } 
      }); 
     } 
    }; 

    mRecyclerView.setAdapter(mFirebaseRecyclerAdapter); 
    mFirebaseRecyclerAdapter.notifyDataSetChanged(); 
} 

其中,鍺TQuery的方法如下:

private Query getQuery(String transactionStatus) { 

    Query transactionsQuery = null; 
    int sectionNumber = getArguments().getInt(SECTION_NUMBER); 
    if (sectionNumber == 0) { // Renter fragment 
     if (transactionStatus == null || transactionStatus.equals(MyConstants.TransactionStatusConstants.allTransactionsValue)) 
      transactionsQuery = FirebaseDatabaseHelper.getTransactionsAllReference().orderByChild("productRenter").equalTo(UserHelper.getCurrentUser().getUid()); 
     else if (transactionStatus.equals(MyConstants.TransactionStatusConstants.waitingApprovalValue)) 
      transactionsQuery = FirebaseDatabaseHelper.getTransactionsWaitingApprovalReference().orderByChild("productRenter").equalTo(UserHelper.getCurrentUser().getUid()); 
     ... 

    } 
    if (sectionNumber == 1) { // Owner fragment 
     if (transactionStatus == null || transactionStatus.equals(MyConstants.TransactionStatusConstants.allTransactionsValue)) 
      transactionsQuery = FirebaseDatabaseHelper.getTransactionsAllReference().orderByChild("productOwner").equalTo(UserHelper.getCurrentUser().getUid()); 
     else if (transactionStatus.equals(MyConstants.TransactionStatusConstants.waitingApprovalValue)) 
      transactionsQuery = FirebaseDatabaseHelper.getTransactionsWaitingApprovalReference().orderByChild("productOwner").equalTo(UserHelper.getCurrentUser().getUid()); 
     ... 
    } 
    return transactionsQuery; 
} 

有了上面的查詢,我已經跑出來的選項,在查詢執行另一個orderByKey /兒童/值。如寫在docs,我不能執行一個雙orderBy查詢。

您一次只能使用一個 order-by方法。在同一查詢中多次調用訂單 方法會引發錯誤。

問題:隨着每一個新的事務處理對象推到數據庫中,它是在再循環器視圖的底部示出。我如何根據orderDate屬性按降序對數據進行排序?這樣每一筆新的交易都將作爲回收商視圖的第一項顯示出來?

same documentation page,據說:

使用推送()方法來在多用戶應用 數據追加到列表。每次將 新子添加到指定的Firebase引用時,push()方法都會生成一個唯一鍵。通過爲列表中的每個新元素使用這些 自動生成的密鑰,多個客戶端 可以在不寫 衝突的情況下同時向同一位置添加子項。 push()生成的唯一密鑰基於時間戳 ,因此列表項自動按照時間順序訂購

我想要訂購的物品按時間順序逆轉

希望Firebase團隊的成員能夠就如何優雅地實現此方案向我提供建議。

+1

在你的問題中有很多事情要有效解析它。但如果您的問題是如何在FirebaseUI適配器中反轉結果,這是[更優雅的解決方案之一](https://github.com/firebase/FirebaseUI-Android/issues/310#issuecomment-247816246) (但[此](https://github.com/firebase/FirebaseUI-Android/issues/90)也可以) –

+0

哇,這是一些開箱即用的想法!謝謝弗蘭克! –

回答

0

最初,我想在作品中會有一些額外的比較器,但事實證明,弗蘭克的回答讓我走向了正確的方向。

每坦率的評論上面,這兩個技巧爲我工作:

覆蓋的FirebaseRecyclerAdapter內的getItem方法如下:

@Override 
public User getItem(int position) { 
     return super.getItem(getItemCount() - 1 - position); 
} 

但我最後用設置LinearLayoutManager如下去:

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false); 
linearLayoutManager.setStackFromEnd(true); 
linearLayoutManager.setReverseLayout(true); 
mRecyclerView.setLayoutManager(linearLayoutManager); 

儘管此解決方案確實解決了我的問題,但希望Firebase庫中還會有更多增強功能操縱。

+0

通過想知道用戶如何在特定時間查看某個對象,您會意識到您仍然受到限制。應該有一個覆蓋方法來重新排序和相應的項目排序。 – Alexander

+0

第二種方法的問題是,當您添加新項目時,RecyclerView將不會自動滾動到頂部。 –

相關問題