首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >RecyclerView notifyItemMoved()不更新位置

RecyclerView notifyItemMoved()不更新位置
EN

Stack Overflow用户
提问于 2018-07-09 08:02:08
回答 3查看 4K关注 0票数 2

为什么notifyItemMoved不重新绑定(我的意思是onBindViewHolder没有调用)我回收视图的适配器?在顶部或底部移动项目后,我会在单击时得到旧位置

如何通过点击获得itemView的当前位置?

我的回收方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    fun moveUp(position: Int){
    if(position>0){
        itemList.swap(position, position-1)
        notifyItemMoved(position, position-1)
    }
}
fun moveDown(position: Int){
    if(itemList.lastIndex>position){
        itemList.swap(position, position + 1)
        notifyItemMoved(position, position + 1 )

    }
}

我的绑定方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    override fun View.bind(item: Document, position: Int) {
    document_name.text = getFileName(item.file)
    this.setOnClickListener{
        onItemClick(this, position)

    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-09 08:18:46

当项移动但没有更改时,应该调用notifyItemMoved()

这是一个结构性变化事件。数据集中其他现有项目的表示仍然被认为是最新的,不会反弹,尽管它们的位置可能会被更改为

这意味着给予onBindViewHolder()的位置可能会发生变化。您可以使用ViewHolder.getAdapterPosition()获得当前位置。

票数 8
EN

Stack Overflow用户

发布于 2019-03-20 22:28:14

尝试在notifyItemChanged(position, payload)之后使用notifyItemMoved。它不停地漏水!

使用holder.adapterPosition

票数 0
EN

Stack Overflow用户

发布于 2021-04-01 06:15:13

为了更新viewholder的位置,必须通知适配器更改了哪些项,因此可以使用适配器中可用的notifyItemRangeChanged(startPosition,itemCount)方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      override fun onMove(
                p0: RecyclerView,
                p1: RecyclerView.ViewHolder,
                p2: RecyclerView.ViewHolder
            ): Boolean {
                val sourcePosition = p1.adapterPosition
                val targetPosition = p2.adapterPosition
                Collections.swap(savedUris, sourcePosition, targetPosition)
                adapter.notifyItemMoved(sourcePosition, targetPosition)
              
               //update your list ,i am using mutable livedata
               _list.postValue(savedUris) //updating existing list with new data

              // Notifying
                if (sourcePosition < targetPosition) {
                    adapter.notifyItemRangeChanged(
                        sourcePosition,
                        (targetPosition - sourcePosition) + 1
                    )
                } else {
                    adapter.notifyItemRangeChanged(
                        targetPosition,
                        (sourcePosition - targetPosition) + 1
                    )
                }
                return true
            }

它不是正确的解决方案,在错误的项目动画中可能有副作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51249698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文