我正在使用Android上的Firebase構建應用程序。我的應用場景如下。看看下面的屏幕。Android - 使用FirebaseRecyclerAdapter進行客戶端排序
正如你所看到的,上面的畫面,我顯示基於用戶角色事務列表:租賃者和所有者。此外,在工具欄中,用戶可以輕鬆過濾任何事務狀態,如下面的屏幕所示。
爲了實現這個場景,我模仿我的數據庫結構如下:
- 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屬性按降序對數據進行排序?這樣每一筆新的交易都將作爲回收商視圖的第一項顯示出來?
使用推送()方法來在多用戶應用 數據追加到列表。每次將 新子添加到指定的Firebase引用時,push()方法都會生成一個唯一鍵。通過爲列表中的每個新元素使用這些 自動生成的密鑰,多個客戶端 可以在不寫 衝突的情況下同時向同一位置添加子項。 push()生成的唯一密鑰基於時間戳 ,因此列表項自動按照時間順序訂購。
我想要訂購的物品按時間順序逆轉。
希望Firebase團隊的成員能夠就如何優雅地實現此方案向我提供建議。
在你的問題中有很多事情要有效解析它。但如果您的問題是如何在FirebaseUI適配器中反轉結果,這是[更優雅的解決方案之一](https://github.com/firebase/FirebaseUI-Android/issues/310#issuecomment-247816246) (但[此](https://github.com/firebase/FirebaseUI-Android/issues/90)也可以) –
哇,這是一些開箱即用的想法!謝謝弗蘭克! –