2016-11-02 24 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将不会自动滚动到顶部。 –

相关问题