我正在使用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)也可以) –
哇,这是一些开箱即用的想法!谢谢弗兰克! –