问题描述
我正在尝试编写一个 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 (将#修改为@)