Android 听单个事件的简洁方式

Android 听单个事件的简洁方式,android,firebase,kotlin,Android,Firebase,Kotlin,是否有一种简洁的方法可以只添加子项或任何事件?现在我必须做以下事情,这看起来很愚蠢 ref.addChildEventListener(object : ChildEventListener { override fun onCancelled(p0: DatabaseError) {} override fun onChildChanged(p0: DataSnapshot, p1: String?) {} override fun onChildMoved(p0: D

是否有一种简洁的方法可以只添加
子项
或任何事件?现在我必须做以下事情,这看起来很愚蠢

ref.addChildEventListener(object : ChildEventListener {
    override fun onCancelled(p0: DatabaseError) {}
    override fun onChildChanged(p0: DataSnapshot, p1: String?) {}
    override fun onChildMoved(p0: DataSnapshot, p1: String?) {}
    override fun onChildRemoved(p0: DataSnapshot) {}
    override fun onChildAdded(p0: DataSnapshot, p1: String?) {
        subscriber.onNext(Value.parse(unitName, varName, p0))
    }
})

在您的情况下,通常将其所有方法称为适配器的模式的名称:

ref.addChildEventListener(object : ChildEventAdapter {
   override fun onChildAdded(p0: DataSnapshot, p1: String?) {
        subscriber.onNext(Value.parse(unitName, varName, p0))
    }
})
(接口)适配器类是一个用空方法实现接口的类,因此您可以选择要覆盖的方法

object EmptyChildEventListener : ChildEventListener {
     override fun onCancelled(p0: DatabaseError) {}
     override fun onChildChanged(p0: DataSnapshot, p1: String?) {}
     override fun onChildMoved(p0: DataSnapshot, p1: String?) {}
     override fun onChildRemoved(p0: DataSnapshot) {}
     override fun onChildAdded(p0: DataSnapshot, p1: String?) { }
} 

ref.addChildEventListener(object : ChildEventListener by EmptyChildEventListener {
     override fun onChildAdded(p0: DataSnapshot, p1: String?) {
         subscriber.onNext(Value.parse(unitName, varName, p0))
     }
})

编辑:但是你可以这样改进

inline fun DatabaseReference.onChildAdded(crossinline added: (DataSnapshot, String?) -> Unit) {
    this.addChildEventListener(object : ChildEventListener by EmptyChildEventListener {
         override fun onChildAdded(p0: DataSnapshot, p1: String?) = added(p0, p1)
    })
})
现在你可以做了

ref.onChildAdded { p0, p1 -> 
    subscriber.onNext(Value.parse(unitName, varName, p0))
}

您可以创建自己的抽象类来实现ChildEventListener,但不提供onChildAdded的实现:

abstract class ChildAddedEventListener : ChildEventListener {
    override fun onCancelled(p0: DatabaseError) {
    }

    override fun onChildMoved(p0: DataSnapshot, p1: String?) {
    }

    override fun onChildChanged(p0: DataSnapshot, p1: String?) {
    }

    override fun onChildRemoved(p0: DataSnapshot) {
    }
}
然后,将ChildAddedEventListener子类化,并提供所需的实现:

class MyChildAddedEventListener: ChildAddedEventListener {
    override fun onChildAdded(p0: DataSnapshot, p1: String?) {
        // your code here
    }
}
这样,在将其添加到查询时,可以将其用作内联对象表达式:

query.addChildEventListener(object : ChildAddedEventListener() {
    override fun onChildAdded(p0: DataSnapshot, p1: String?) {
        subscriber.onNext(Value.parse(unitName, varName, p0))
    }
})

这是我从手机中收集到的最好的信息了,我也许可以给你写点交叉线的东西。检查我从电脑上修改的答案。这很糟糕,因为你仍然需要为每1GB下载一次儿童更改、一次儿童移动和一次儿童移动的数据收取1美元的费用。在iOS和Web中,您只能侦听特定的子事件,如onChildAdded。只有在安卓系统中,您才被迫收听所有子事件。你能核实一下这个限制吗?Android Firebase SDK不像iOS和Web Firebase SDK那样工作,我必须创建另一种(非常低效的方式)来专门为Android设置侦听器。我只想侦听onchildaded和onChildRemoved,而不是onChildChanged。现在,我必须在推送孩子时在某处放置一个标志,以便客户机可以在添加或删除孩子时重新加载整个列表。我无法设置childEventListener,因为如果我设置了它,我将为onChildChanged收取费用。我在子树中有一个单独的onChildChanged侦听器。Android SDK ChildListener没有给开发人员任何灵活性,而且它与iOS和Web平台不一致。@如果您对Firebase API有反馈或建议,我建议将其发送给Firebase支持部门。否决一个答案不会改变今天事情运作方式的现实。我真的很感谢你对这一限制的确认。非常感谢。我会在我的终端上打补丁,为安卓系统提供定制解决方案——在我的终端上做更多的工作。每当我从列表中推送或删除时,我可以模拟childAdded和childDeleted by,设置时间戳标志,当该时间戳标志小于当前客户端本地时间戳时,刷新整个列表。然而,没有什么比Firebase更伟大了!正如你所说,我也在提交支持请求。谢谢你所做的一切。这是一个很好的问题。你不应该被强迫去听所有的子事件,因为它会给你下载的数据带来额外的费用。在iOS和Web Firebase SDK中,您可以侦听任何特定的子事件,但在Android Firebase SDK中,您必须侦听所有子事件。这似乎是Android Firebase SDK中的一个bug。