gpt4 book ai didi

android - ItemTouchHelper onMove 更新元素位置

转载 作者:行者123 更新时间:2023-12-02 13:31:40 26 4
gpt4 key购买 nike

使用 itemTouchHelper onMove 方法时。如何根据列表中的位置使用编号列表。

例如,项目1,项目2,项目3等都是基于项目在列表中的实际位置。如何通过向上或向下拖动来移动项目。更新列表中的其余项目以反射(reflect)其在列表中的正确位置?

我正在使用以下代码:

override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {

val fromPosition = viewHolder.adapterPosition
val toPosition = target.adapterPosition

Collections.swap(steps!!, fromPosition, toPosition)

recyclerView.adapter!!.notifyItemMoved(fromPosition,toPosition)

return true
}

fragment :

enter image description here

视频:

enter image description here

更新(适配器代码):
val TAG:String = "StepAdapter"
var steps: MutableList<Step> = ArrayList()

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StepViewHolder {
return StepViewHolder(
LayoutInflater.from(parent.context)
.inflate(R.layout.recipe_property_step_list_item, parent, false))
}

override fun getItemCount(): Int{
return steps.size
}

override fun onBindViewHolder(holder: StepViewHolder, position: Int) {
holder.bind(steps.get(position), position)
Log.i(TAG,"onBindViewHolder - ${steps.get(position)}")
}

override fun onBindViewHolder(holder: StepViewHolder, position: Int, payloads: MutableList<Any>) {
Log.i(TAG,"onBindViewHolder - Payloads - $payloads")
val text:String = StringBuilder("${position + 1}.) ${steps[position].text}").toString()
Log.i(TAG,"onBindViewHolder - Text - $text")
holder.st_text.text = text
}

fun updateSteps(newSteps: MutableList<Step>){
val diffResult = DiffUtil.calculateDiff(StepDiffCallBack(this.steps,newSteps))
this.steps.clear()
this.steps.addAll(newSteps)
notifyDataSetChanged()
diffResult.dispatchUpdatesTo(this)
}

日志:
2020-04-12 16:57:21.787 15808-15808/com.keep.recipeapp I/StepAdapter: onBindViewHolder - Payloads - []
2020-04-12 16:57:21.787 15808-15808/com.keep.recipeapp I/StepAdapter: onBindViewHolder - Text - 1.) Prepping the kitchen sink
2020-04-12 16:57:21.789 15808-15808/com.keep.recipeapp I/StepAdapter: onBindViewHolder - Payloads - []
2020-04-12 16:57:21.789 15808-15808/com.keep.recipeapp I/StepAdapter: onBindViewHolder - Text - 2.) prep the nuts and bolts
2020-04-12 16:57:21.791 15808-15808/com.keep.recipeapp I/StepAdapter: onBindViewHolder - Payloads - []
2020-04-12 16:57:21.791 15808-15808/com.keep.recipeapp I/StepAdapter: onBindViewHolder - Text - 3.) Cook the kitchen sink

测试数据

最佳答案

实现此目的的唯一方法是重新绑定(bind)您的 ViewHolder所以他们的TextView s 显示改变的位置。但是调用notifyDataSetChanged()notifyItemRangeChanged(0, pos)将让您的所有项目淡出并淡入,因为它们都被重新绑定(bind),我不建议这样做,因为它非常丑陋(但仍然, 它会工作 )

你有没有用过方法onBindViewHolder(holder: ViewHolder, position: Int, payloads: MutableList<Any>) ?这允许只更新一些 View在您的ViewHolder 中不重绘整个View ,所以您的 RecyclerView 中的更改会顺畅很多。

在您的 onMove您调用的方法notifyItemRangeChanged提供应该更新的项目范围,并提供 Any() 作为有效负载,因为重新绑定(bind) View 不需要额外的信息,因为您将在适配器的方法中访问位置和数据。

    override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
val fromPosition = viewHolder.adapterPosition
val toPosition = target.adapterPosition
Collections.swap(steps!!, fromPosition, toPosition)

recyclerView.adapter!!.notifyItemMoved(fromPosition,toPosition)
recyclerView.adapter!!.notifyItemRangeChanged(0, max(fromPosition, toPosition), Any())
// as you dont need to change items that are below the maximum positions
// their positions will be correct
return true
}

请记住,您应该调用 super如果有效负载为空,则方法。
    override fun onBindViewHolder(holder: MyViewHolder, position: Int, payloads: MutableList<Any>) {
if (payloads.isEmpty()) super.onBindViewHolder(holder, position, payloads)
else {
holder.theTextView.text = "$position.)${myList[position].data}"
}
}

更新

您确定调用 notifyItemRangeChanged(min(fromPos, toPos), max(fromPos,toPos) ?这个东西会调用 onBindViewHolder对于范围内的每个项目。您应该在调用 notifyItemMoved 之后再调用它。 .当它工作时,尝试将对象作为有效负载传递。

日志不显示行为,它似乎是适配器在初始化后绑定(bind) View 时的输出。

关于android - ItemTouchHelper onMove 更新元素位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61048466/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com