【问题标题】:Launch sound only when recyclerview new item comes仅在 recyclerview 新项目出现时启动声音
【发布时间】:2020-04-23 13:41:33
【问题描述】:

所以,我正在使用 firebase,每次有新项目填充我的回收站视图时,我都想发出声音。

我所做的是放置一个界面,每次新的绑定发生时都会启动

适配器

 inner class ProductViewHolder(itemView: View) : BaseViewHolder<Product>(itemView) {
        override fun bind(item: Pedido, position: Int) {


                itemListener?.launchNotificationSound()

}

现在,在我看来,我只是用这个界面播放声音

override fun launchNotificationSound() {
     mediaPlayer?.start()
  }

这很好用!

但是当我滚动时,很明显 onBind 会再次触发,所以我正在寻找一种方法来在新项目进入 recyclerview 时播放此声音,而不总是在绑定时播放此声音

有什么建议吗?

我正在使用带有实时更新的 firebase firestore,所以当我向我的数组中添加一个新元素时,它会在 recyclerview 中实时显示,我只想在添加新项目后发出声音

问题是,如果我在实时监听器上播放声音,它也会在删除项目以及在数据库中对该项目进行新更改时触发,而我的目标是在新数据时播放声音只有在更新时才会出现

【问题讨论】:

    标签: android firebase kotlin


    【解决方案1】:

    您可以通过这种方式将DefaultItemAnimator添加到recyclerview。每次将新项目添加到 recyclerview 时,都会触发 onAddFinished 方法。

    class MyDefaultItemAnimator(var music: MusicPlayer): DefaultItemAnimator() {
        override fun onAddFinished(item: RecyclerView.ViewHolder?) {
            super.onAddFinished(item)
            mediaPlayer?.start()
        }    
    }
    

    然后将此添加到您的回收站视图中。

    mRecyclerView.setItemAnimator(MyDefaultItemAnimator())
    

    【讨论】:

    • 很好,即使从recyclerview中删除了一个项目也不会触发?
    • 是的。你能测试一下并回复我吗?如果可行,则接受此作为答案。
    • 是的,当然谢谢!我正在测试,顺便说一句,您忘记将 mediaplayer 传递给 defaultitemanimator,而参数不是 musicplayer 而是 mediaplayer
    • 不行,这样不行,声音不播放,我想是因为执行的上下文,我试试改一下
    【解决方案2】:

    由于声音取决于向数据集中添加项目,您可以使用registerAdapterDataObserver 监听适配器中的数据更改并覆盖onItemRangeInserted,此回调将通过调用notifyItemInserted() 来触发,例如

    注册观察者

         customAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver(){
    
         override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
             super.onItemRangeInserted(positionStart, itemCount)
             playSound() // play your custom sound
         }
    })
    

    将项目添加到您的数据集中 Adapter

    dataSet.add("Added new element")
    notifyItemInserted(dataSet.size)
    

    【讨论】:

    • 我不按一项添加,而是按整个列表添加
    • @CoffeeBreak 您是否每次都添加整个列表?还是覆盖旧的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2019-06-09
    • 2012-07-17
    • 2017-06-22
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多