BaseRecyclerViewAdapterHelper
BaseRecyclerViewAdapterHelper copied to clipboard
4.x版本notifyItemChanged带payloads没有回调问题的解决和建议
版本: 4.1.4
问题: 4.x版本notifyItemChanged带payloads没有回调,示例代码如下
mAdapter[index] = newItem //这里其实已经调用了notifyItemChanged
mAdapter.notifyItemChanged(index, MomentAdapter.PAY_LOAD_UPDATE_LIKE) //再次调用notifyItemChanged带payloads 由于缓存原因或者更新间隔太短的拦截 此次更新是不会回调到onBindViewHolder()带payloads的方法的
原因: 由于新版的BaseQuickAdapter无法直接操作到data,只能通过adapter[position] = newItem的方式对指定位置的item数据进行更改,但是此方法会调用notifyItemChanged(position)
open operator fun set(@IntRange(from = 0) position: Int, data: T) {
if (position >= items.size) {
throw IndexOutOfBoundsException("position: ${position}. size:${items.size}")
}
mutableItems[position] = data
notifyItemChanged(position) //这一行调用了更新item
}
解决: 重写adapter的set方法,不进行notifyItemChanged,而是在使用的过程中自己手动调用notifyItemChanged
建议: 希望可以把BaseQuickAdapter的set方法中的notifyItemChanged进行移除,或者通过传多一个autoNotify参数,默认不通知,用户如果想顺便直接notifyItemChanged的话就传true