我正在尝试从一个回收器项目视图类发布一个事件总线事件,并在同一个类中订阅它,以便该事件被所有回收器项目捕获。
现在更详细地说:
我有一个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)
}
...