android eventbus view,尝试通过EventBus影响RecyclerView项

我正在尝试从一个回收器项目视图类发布一个事件总线事件,并在同一个类中订阅它,以便该事件被所有回收器项目捕获。

现在更详细地说:

我有一个RecyclerView,其中每个项目(friendListItem.kt)都有一个上下文菜单。一次只能显示一个上下文菜单。这意味着如果另一个项目的上下文菜单可见,我需要关闭它。

我选择使用

org.greenrobot.eventbus

我们已经在应用程序中广泛使用。在item类中,当要显示菜单时,我发布一个事件,并在同一个类中获取它。我以为这样所有的项目都会响应并关闭它们的(可能可见的)菜单,但是事件订阅者不会获取任何东西。

我将添加包含片段的寄存器,并按照它应该的方式注销EventBus,因为它在另一个事件中工作正常。

这里的问题可能是事件应该在一个回收者项目视图中被抓取,该视图显示在多个项目中。可以吗?

这是项目:

package com.myapp.android.common.social.friends

import android.content.Context

import android.text.Spanned

import android.view.View

import android.view.View.OnClickListener

import android.widget.ImageView

import android.widget.LinearLayout

import com.myapp.android.common.R

import com.myapp.android.common.database.room.entities.User

import com.myapp.android.common.generic.coachmark.BubbleCoachMark

import com.myapp.android.common.image.ImageSize

import com.myapp.android.common.social.friends.events.FriendsListResetOtherMenus

import kotlinx.android.synthetic.main.friends_list_item.view.*

import org.greenrobot.eventbus.EventBus

import org.greenrobot.eventbus.Subscribe

import org.greenrobot.eventbus.ThreadMode

class FriendsListItem(context: Context) : LinearLayout(context) {

private var user: User? = null

private var menu: BubbleCoachMark? = null

init {

View.inflate(context, R.layout.friends_list_item, this)

}

fun updateView(user: User, sp: Spanned?) {

this.user = user

// Avatar

if (user.pictureUrl != "") {

setUserPicture(user.pictureUrl + "", user.isPremium)

}

// Premium

when {

user.isPremium -> friendPremium.visibility = View.VISIBLE

else -> friendPremium.visibility = View.GONE

}

// Name

when (sp) {

null -> friendName!!.text = user.name

else -> friendName!!.text = sp

}

// Friend Status

invite.visibility = View.GONE

action.visibility = View.VISIBLE

when (user.status) {

User.Status.friend -> {

action.setImageResource(R.drawable.ic_friend_options)

action.setOnClickListener(OnClickListener {

EventBus.getDefault().post(FriendsListResetOtherMenus())

when (menu) {

null -> {

menu = BubbleCoachMark(BubbleCoachMark.BubbleCoachMarkBuilder(context, action, FriendsListItemMenu(context)).setShowBelowAnchor(true))

menu!!.show()

}

else -> {

if (!menu!!.isShowing)

menu!!.show()

}

}

})

}

User.Status.pending -> {

action.setImageResource(R.drawable.ic_friend_requested)

}

User.Status.nofriend -> {

action.setImageResource(R.drawable.ic_friend_add)

}

else -> {

invite.visibility = View.VISIBLE

action.visibility = View.GONE

}

}

}

fun setUserPicture(pictureUrl: String, isPremium: Boolean) {

synchronized(this) {

friendAvatar!!.scaleType = ImageView.ScaleType.CENTER_CROP

friendAvatar!!.setUserPicture(pictureUrl, isPremium, R.drawable.profile_silhuette_new, ImageSize.thumbnail)

}

}

// The method here is not grabbing the event

@Subscribe(threadMode = ThreadMode.MAIN)

fun onEventMainThread(event: FriendsListResetOtherMenus) {

if (menu != null && !menu!!.isShowing)

menu!!.dismiss()

}

}

更新的解决方案:

在本地注册了EventBus

init

条款:

...

init {

View.inflate(context, R.layout.friends_list_item, this)

EventBus.getDefault().register(this@FriendsListItem)

}

...

已在中注销EventBus

onDetachedFromWindow

事件:

...

override fun onDetachedFromWindow() {

super.onDetachedFromWindow()

EventBus.getDefault().unregister(this@FriendsListItem)

}

...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值