Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android DiffUtil.ItemCallback不更新项目位置(删除后)_Android_Android Recyclerview_Android Diffutils_Android Listadapter - Fatal编程技术网

Android DiffUtil.ItemCallback不更新项目位置(删除后)

Android DiffUtil.ItemCallback不更新项目位置(删除后),android,android-recyclerview,android-diffutils,android-listadapter,Android,Android Recyclerview,Android Diffutils,Android Listadapter,我对具有DiffUtil.ItemCallback定义的ListAdapter使用绑定。当删除至少2个项目时,我有一个IndexOutOfBoundsException。 列表的更新工作在删除后元素的数量确实是N-1,但不是项目的位置,保留的是调用。因此,在onBindViewHolder中调用getItemposition时会引发异常。注意:getItemposition之前的getItemCount日志显示该列表包含N-1个元素。 我创建了一个小型回购:与我的项目具有相同的配置,重现了问题

我对具有DiffUtil.ItemCallback定义的ListAdapter使用绑定。当删除至少2个项目时,我有一个IndexOutOfBoundsException。 列表的更新工作在删除后元素的数量确实是N-1,但不是项目的位置,保留的是调用。因此,在onBindViewHolder中调用getItemposition时会引发异常。注意:getItemposition之前的getItemCount日志显示该列表包含N-1个元素。 我创建了一个小型回购:与我的项目具有相同的配置,重现了问题

ItemAdapter类


在onBindViewHolder中将“position”的用法更新为“holder.getAdapterPosition”:

override fun onBindViewHolder(holder: DataBindingViewHolder<Item>, position: Int) {
        super.onBindViewHolder(holder, position)

        holder.itemView.tv_position.text = "Pos: $position"

        holder.itemView.setOnLongClickListener {
            Timber.d("List item count: ${itemCount}, position: $position")
            listener.onLongViewClick(getItem(holder.getAdapterPosition()), holder.getAdapterPosition())
        }
    }
abstract class DataBindingAdapter<T>(diffCallback: DiffUtil.ItemCallback<T>) :
    ListAdapter<T, DataBindingViewHolder<T>>(diffCallback) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DataBindingViewHolder<T> {
        val layoutInflater = LayoutInflater.from(parent.context)
        val binding = DataBindingUtil.inflate<ViewDataBinding>(layoutInflater, viewType, parent, false)

        return DataBindingViewHolder(binding)
    }

    override fun onBindViewHolder(holder: DataBindingViewHolder<T>, position: Int) {
        holder.bind(getItem(position))
    }
}

class DataBindingViewHolder<T>(private val binding: ViewDataBinding) :
    RecyclerView.ViewHolder(binding.root) {

    fun bind(item: T) {
        binding.setVariable(BR.item, item)
        binding.executePendingBindings()
    }
}
itemViewModel.getListObserver().observe(this, Observer {
        Timber.d("List Observer, items count ${it.size}")
        itemAdapter.submitList(it.toList())
    })
override fun onBindViewHolder(holder: DataBindingViewHolder<Item>, position: Int) {
        super.onBindViewHolder(holder, position)

        holder.itemView.tv_position.text = "Pos: $position"

        holder.itemView.setOnLongClickListener {
            Timber.d("List item count: ${itemCount}, position: $position")
            listener.onLongViewClick(getItem(holder.getAdapterPosition()), holder.getAdapterPosition())
        }
    }