ПОЧЕМУ НЕ ПОМОГАЕТ МНЕ ЛЮДЯМ ???
В моем приложении я хочу использовать RxBus
для обработки событий и MVP для шаблона проектирования! я хочу, чтобы при нажатии на один из recyclerview
элементов вызывался один метод в fragment
.
Для этого я использовал RxBus !
Я пишу ниже коды, но при нажатии на предметы вызывать 2 раза метод !!!
Коды RxBus:
object RxBus {
private val publisher = PublishSubject.create<Any>()
fun publish(event: Any) {
publisher.onNext(event)
}
fun <T> listen(eventType: Class<T>): Observable<T> = publisher.ofType(eventType)
}
Коды адаптеров:
class DashboardAvatarsAdapter constructor(
private val context: Context, private val model: List<String>,
private val url: String
) :
RecyclerView.Adapter<DashboardAvatarsAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(parent.context)
return ViewHolder(inflater.inflate(R.layout.row_dashboard_avatars, parent, false))
}
override fun getItemCount() = model.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.avatarImg.showImageGlide(context, "$BASE_URL_IMAGE$url${model[position]}", holder.avatarLoader)
holder.avatarImg.setOnClickListener {
RxBus.publish(EventUpdateAvatar.UpdateAvatar(EVENTS_UPDATE_SEND_AVATAR, model[position]))
Log.e("uploadAvatarLog", "Adapter")
}
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val avatarImg: ImageView = itemView.findViewById(R.id.avatarItemList_img)
val avatarLoader: ProgressBar = itemView.findViewById(R.id.avatarItemList_progress)
}
}
Коды фрагментов:
class DashboardAvatarsFragment : RoundedBottomSheetDialogFragment(), DashboardAvatarsContracts.View {
@NonNull
private lateinit var presenter: DashboardAvatarsPresenterImpl
private lateinit var token: String
private lateinit var layoutManager: GridLayoutManager
private lateinit var adapter: DashboardAvatarsAdapter
@NonNull
private var disposable: Disposable? = null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_dashboard_avatars, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//Initialize
presenter = DashboardAvatarsPresenterImpl(requireContext(), this)
layoutManager = GridLayoutManager(requireContext(), 5)
//Get token
token = GoodPrefs.getInstance().getString(PrefsKey.USER_JWT_TOKEN.name, "")
//Send avatar
disposable = RxBus.listen(EventUpdateAvatar.UpdateAvatar::class.java).subscribe {
if (it.updateType == EVENTS_UPDATE_SEND_AVATAR) {
Log.e("uploadAvatarLog", "Event")
presenter.sendAvatarId(token, it.avatarId)
}
}
//Get avatars list
presenter.loadData(token)
}
override fun showAvatars(res: DashboardAvatarsResponse.Res) {
adapter = DashboardAvatarsAdapter(requireContext(), res.avatars, res.baseUrl)
dashboardAvatars_recyclerView.initRecyclerView(layoutManager, adapter)
}
override fun updateAvatar() {
RxBus.publish(EventUpdateAvatar.UpdateAvatar(EVENTS_UPDATE_AVATAR, ""))
Log.e("uploadAvatarLog", "Receive")
}
}
Я использовал Log.e
для просмотра журнала, но покажи мне дубликат некоторые журналы !
2019-05-07 12:15:35.901 10259-10259/com.app.android E/uploadAvatarLog: Event
2019-05-07 12:15:35.902 10259-10259/com.app.android E/uploadAvatarLog: Adapter
2019-05-07 12:15:35.978 10259-10259/com.app.android E/uploadAvatarLog: Send
2019-05-07 12:15:35.978 10259-10259/com.app.android E/uploadAvatarLog: Event
2019-05-07 12:15:35.978 10259-10259/com.app.android E/uploadAvatarLog: Receive
2019-05-07 12:15:36.008 10259-10259/com.app.android E/uploadAvatarLog: Send
Как я могу это исправить?