Как исправить вызов метода дублирования в RxBus в Android - PullRequest
1 голос
/ 07 мая 2019

ПОЧЕМУ НЕ ПОМОГАЕТ МНЕ ЛЮДЯМ ???

В моем приложении я хочу использовать 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

Как я могу это исправить?

...