android - 如何在 FirebaseRecyclerAdapter 中使用 orderByChild 或 orderByValue

标签 android firebase firebase-realtime-database firebaseui

我正在寻找一种方法将我的数据分类到 RecyclerView 中。目前我正在为此使用优先级方法,但我知道最好应用 orderByChildorderByValue 方法来实现此目的。我只是找不到如何正确地执行此操作。

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

path /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 }
}

FirebaseRecyclerAdapter 当前初始化如下:

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);
             ....

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

我想直接对实例进行排序(使事情不那么复杂并能够删除优先级的使用)。

附注尽管看起来数据未规范化,但情况确实如此:/events/{event} 路径从未用于检索数据。这样做只是为了保持一些概览。

最佳答案

如果您已经有一个具有您想要订购的值(value)的 child ,则不需要优先级。从评论看来,您的优先级与开始日期的值相同。在这种情况下,您还可以按该属性进行排序:

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

您需要为实例添加索引:

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

更新

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

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

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

关于android - 如何在 FirebaseRecyclerAdapter 中使用 orderByChild 或 orderByValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39561612/

相关文章:

Android Studio 1.4 抽屉导航

android - 每次应用程序启动时,都应在 TextView 中显示新文本

swift - 从 Collection View 单元格转到 TableView 单元格

javascript - 将辅助数据传递给我的第二个回调函数

javascript - 返回 Json 的 Firebase 函数

android - 自定义 View 样式,忽略android的属性

android - Mac 错误创建 Android 项目 - 项目上的 "Errors running builder ' Android 资源管理器“

java - 像安卓市场一样滑动标签栏

javascript - Firebase 等待响应

java - 如何在 onBindViewHolder 中将查询到的数据分配给 String 或 int?