Skip to content

AutoDisposePagedListAdapter 生命周期问题 #6

@windows7lake

Description

@windows7lake

在使用AutoDisposePagedListAdapter对RecyclerView.ViewHolder进行管理时,发现一个问题:
在CustomeAdapter的CustomeViewHolder中使用如下代码设置item的点击事件时,此时如果更新pageList中的数据(是更新不是插入或者删除),RecyclerView会走onBindViewHolder(),之后会导致item的点击事件失效。

 view.clicks()
    .map { position }
    .autoDisposable(this)
    .subscribe(subject)

进一步分析之后,大致原因在于更新数据时,RecyclerView会先onBindViewHolder(),再调用onViewRecycled()对item资源进行回收。OnUnbindsPosition使被更新的Item点击事件失效了。虽然大致知道了问题,如果只是更新一项的话,我通过记录position可以解决问题,但是当更新的项有多个时就无从下手了。
AutoDisposePagedListAdapter中的代码:

    @CallSuper
    override fun onBindViewHolder(holder: VH, position: Int) {
        when (holder) {
            is AutoDisposeViewHolder -> {
                holder.resetBindEvents(this)
            }
        }
    }

    @CallSuper
    override fun onViewRecycled(holder: VH) {
        super.onViewRecycled(holder)
        when (holder) {
            is AutoDisposeViewHolder -> {
                postViewHolderEvent(
                    AutoDisposeViewHolder.ViewHolderEvent.OnUnbindsPosition(
                        holder.adapterPosition
                    )
                )
            }
        }
    }

求大神指导。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions