如何在FirebaseRecyclerAdapter中使用orderByChild或orderByValue

时间:2016-09-18 19:12:40

标签: android firebase firebase-realtime-database firebaseui

我正在寻找一种方法将我的数据分类到RecyclerView中。此时我正在使用优先级方法,但我知道最好应用orderByValuepath /events/{event}/GeneralInfo is GeneralInfo{} path /events/{event}/instances/{instance} is Instance{} type GeneralInfo { owner : KeyString, name : ShortNameString | Null, color : Number | Null, description : NoteString | Null, shared : Boolean | Null, startDate : DateString, endDate : DateString, instances: Map<KeyString, Boolean>, logoAvailable : Boolean | Null } type Instance { eventKey : KeyString, startDateTime : DateString, endDateTime : DateString, note : String | Null, } type KeyString extends String { validate() { this.length > 0 && this.length <= 255 } } type DateString extends String { validate() { this.length == 12 } } type ShortNameString extends String { validate() { this.length >= 0 && this.length <= 32 } } 方法来实现此目的。我只是找不到如何正确地做到这一点。

我的(相关)数据结构如下(螺栓格式):

Query q = getGeneralInfo( eventKey ).child( "instances" ).orderByPriority();

mAdapter = new FirebaseRecyclerAdapter<Boolean, InstanceViewHolder>(Boolean.class, R.layout.instance_card, InstanceViewHolder.class, q) {
    @Override
    protected void populateViewHolder(final InstanceViewHolder viewHolder, Boolean model, final int position) {
       getInstanceByKey(mEventKey, refKey).addListenerForSingleValueEvent(new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot dataSnapshot) {
             Instance i = dataSnapshot.getValue(Instance.class);
             ....

FirebaseRecyclerAdapter目前已初始化如下:

{{1}}

请注意,我使用索引键字段(带有布尔值的字段)来检索实际数据。索引字段当前已排序(使用优先级)。

我想直接对实例进行排序(使事情变得简单,并且能够删除优先级的使用)。

P.S。虽然看起来数据没有规范化,但情况是这样的:/ events / {event}路径从不用于检索数据。这只是为了保持一些概述。

1 个答案:

答案 0 :(得分:2)

如果您的孩子已经拥有您想要订购的价值,那么您不需要优先级。从评论中看,您的优先级似乎与开始日期的值相同。在这种情况下,您也可以通过该物业订购:

Query q = getGeneralInfo( eventKey ).child( "instances" ).orderByChild("startDate");

您需要为实例添加索引:

"instances": {
  ".indexOn": "startDate"
}

<强>更新

显然您正在加载/events/{event}/GeneralInfo/instances,您已将其定义为instances: Map<KeyString, Boolean>

由于很明显您要存储一个值,我会将其更改为Map<KeyString, Long>,然后将开始日期的时间戳存储为索引中的值。

然后,您可以使用orderByValue()以正确的顺序加载/过滤它们。