Kotlin Recyclerview 堆栈布局类型显示错误视图

问题描述

我正在尝试编写一个 recyclerview,其中的一些 Viewholder 堆叠在一起。这个想法是,您可以将最上面的视图拖到堆叠列表上方,然后将其放在分离的上方。

我设法使用带有自定义 RecyclerView.Itemdecoration 的 Recyclerview 使其工作。但是,在我放下项目后,我让适配器调用 notifyDataSetChange 来更新后台代码。这会导致堆栈中的下一个项目看起来是错误的(尽管如果您触摸该项目并开始滚动,有时会发生变化,然后它会显示正确的项目)。
自定义 RecyclerView.Itemdecoration 类:

override fun getItemOffsets(
    outRect: Rect,view: View,parent: RecyclerView,state: RecyclerView.State
)
{
    val itemPosition = parent.getChildAdapterPosition(view)
    val adapter = parent.adapter
    if (adapter is BaseRecVAdapter)
    {
        val item = adapter.getDataModel(itemPosition)
        if (item is DragDropModel && item.mStackedPos != PMConsts.negNum)
        {
            if (item.mStackedPos != 0)
            {
                val context = view.context
                val top = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,148f,context.resources.displayMetrics).toInt()
                outRect.set(0,-top,0)
                return
            }
        }
    }
    super.getItemOffsets(outRect,view,parent,state)
}

我为 Adapter 和 itemtouchhelper.Callback 制作的拖拽界面可以在下面找到:
interface itemtouchhelperListener 
{
    fun onItemmove(fromPosition: Int,toPosition: Int): Boolean
    fun onClearView(recyclerView: RecyclerView?,viewHolder: RecyclerView.ViewHolder?)
}

onItem移动代码如下:
override fun onItemmove(fromPosition: Int,toPosition: Int): Boolean
    {
        var newToPosition = toPosition
        if (toPosition <= mDragUpLimit)
        {//Prevent items from being dragged above maximum movement.
            newToPosition = mDragUpLimit + 1
        }
        else if (toPosition >= mDragDownLimit)
        {//Cannot drag below stacked List...
            newToPosition = mDragDownLimit - 1
        }
        if (fromPosition < newToPosition)
            {
                for (i in fromPosition until newToPosition)
                {
                    swap(mDataList,i,i + 1)
                }
            }
            else
            {
                for (i in fromPosition downTo newToPosition + 1)
                {
                    swap(mDataList,i - 1)
                }
            }
            notifyItemmoved(fromPosition,newToPosition)
        return true
    }

我有一个简单的查看器,它是一个不可见的栏,我将其标记为您需要在上方拖动的位置,以便对列表顺序进行有效更改。

我在调用 onClearView() 方法调用了 notifyDataSetChanged 代码,因为我需要更新背景功能,以便堆栈中的下一个项目是可拖动的,并且馈入适配器的背景数据也会更新。这似乎是保持数据更新顺畅的最简单方法,但我想知道它是否会导致我的问题

如果有人能帮我解决这个问题,我将不胜感激。我有点扯掉我的头发。我以为我有一个很好的系统设置,但它不太工作。我希望这些信息足以帮助您解决此问题。
提前致谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...