Kotlin RecyclerView删除项目。这是虫子吗?

Kotlin RecyclerView删除项目。这是虫子吗?,kotlin,android-recyclerview,Kotlin,Android Recyclerview,删除一个项目后,其他项目的索引将损坏。如果我上下滑动,项目索引将正常。因此,如果我想让我的应用程序正常工作,我必须在删除一个项目后上下滑动 这是虫子吗?有什么我能做的吗 这是我录制的视频 MainActivity.kt class MainActivity : AppCompatActivity() { private var dataset = mutableListOf("Item 1", "Item 2", "Item 3",

删除一个项目后,其他项目的索引将损坏。如果我上下滑动,项目索引将正常。因此,如果我想让我的应用程序正常工作,我必须在删除一个项目后上下滑动

这是虫子吗?有什么我能做的吗

这是我录制的视频

MainActivity.kt

class MainActivity : AppCompatActivity() {

private var dataset = mutableListOf("Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6", "Item 7", "Item 8", "Item 9", "Item 10",
    "Item 11", "Item 12", "Item 13", "Item 14", "Item 15", "Item 16", "Item 17", "Item 18", "Item 19", "Item 20",
    "Item 21", "Item 22", "Item 23", "Item 24", "Item 25", "Item 26", "Item 27", "Item 28", "Item 29", "Item 30")

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val myAdapter = MyAdapter(dataset, this)
    val itemDecor = DividerItemDecoration(this, HORIZONTAL)
    recyclerView.addItemDecoration(itemDecor)
    recyclerView.layoutManager = LinearLayoutManager(this)
    recyclerView.adapter = myAdapter

    val itemTouchHelperCallback = object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT){
        override fun onMove(
            recyclerView: RecyclerView,
            viewHolder: RecyclerView.ViewHolder,
            target: RecyclerView.ViewHolder
        ): Boolean {
            return false
        }

        override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
            myAdapter.removeItem(viewHolder)
        }

    }
    val itemTouchHelper = ItemTouchHelper(itemTouchHelperCallback)
    itemTouchHelper.attachToRecyclerView(recyclerView)
}
class MyAdapter(val arrayList: MutableList<String>, val context: Context) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {

private var removedPosition: Int = 0
private lateinit var removedItem: String

class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){

    fun bindItems(data: String){
        itemView.textBox.text = data
    }
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val v = LayoutInflater.from(parent.context).inflate(R.layout.row, parent, false)
    return ViewHolder(v)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.bindItems(arrayList[position])

    holder.itemView.setOnClickListener {
        Toast.makeText(context, arrayList[position], Toast.LENGTH_SHORT).show()
    }
}

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

fun removeItem(viewHolder: RecyclerView.ViewHolder){
    removedPosition = viewHolder.adapterPosition
    removedItem = arrayList[removedPosition]

    arrayList.removeAt(removedPosition)
    notifyItemRemoved(removedPosition)
}
}

MyAdapter.kt

class MainActivity : AppCompatActivity() {

private var dataset = mutableListOf("Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6", "Item 7", "Item 8", "Item 9", "Item 10",
    "Item 11", "Item 12", "Item 13", "Item 14", "Item 15", "Item 16", "Item 17", "Item 18", "Item 19", "Item 20",
    "Item 21", "Item 22", "Item 23", "Item 24", "Item 25", "Item 26", "Item 27", "Item 28", "Item 29", "Item 30")

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val myAdapter = MyAdapter(dataset, this)
    val itemDecor = DividerItemDecoration(this, HORIZONTAL)
    recyclerView.addItemDecoration(itemDecor)
    recyclerView.layoutManager = LinearLayoutManager(this)
    recyclerView.adapter = myAdapter

    val itemTouchHelperCallback = object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT){
        override fun onMove(
            recyclerView: RecyclerView,
            viewHolder: RecyclerView.ViewHolder,
            target: RecyclerView.ViewHolder
        ): Boolean {
            return false
        }

        override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
            myAdapter.removeItem(viewHolder)
        }

    }
    val itemTouchHelper = ItemTouchHelper(itemTouchHelperCallback)
    itemTouchHelper.attachToRecyclerView(recyclerView)
}
class MyAdapter(val arrayList: MutableList<String>, val context: Context) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {

private var removedPosition: Int = 0
private lateinit var removedItem: String

class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){

    fun bindItems(data: String){
        itemView.textBox.text = data
    }
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val v = LayoutInflater.from(parent.context).inflate(R.layout.row, parent, false)
    return ViewHolder(v)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.bindItems(arrayList[position])

    holder.itemView.setOnClickListener {
        Toast.makeText(context, arrayList[position], Toast.LENGTH_SHORT).show()
    }
}

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

fun removeItem(viewHolder: RecyclerView.ViewHolder){
    removedPosition = viewHolder.adapterPosition
    removedItem = arrayList[removedPosition]

    arrayList.removeAt(removedPosition)
    notifyItemRemoved(removedPosition)
}
classmyadapter(val-arrayList:MutableList,val-context:context):RecyclerView.Adapter(){
私有变量removedPosition:Int=0
私有lateinit变量removedItem:字符串
类ViewHolder(itemView:View):RecyclerView.ViewHolder(itemView){
数据项(数据:字符串){
itemView.textBox.text=数据
}
}
override onCreateViewHolder(父级:ViewGroup,viewType:Int):ViewHolder{
val v=LayoutFlater.from(parent.context)。充气(R.layout.row,parent,false)
返回视窗支架(v)
}
覆盖BindViewHolder(holder:ViewHolder,位置:Int){
holder.bindItems(arrayList[位置])
holder.itemView.setOnClickListener{
Toast.makeText(上下文,arrayList[position],Toast.LENGTH\u SHORT.show())
}
}
重写getItemCount():Int{
返回arrayList.size
}
趣味removeItem(视图持有者:RecyclerView.viewHolder){
removedPosition=viewHolder.adapterPosition
removedItem=arrayList[removedPosition]
arrayList.removeAt(removedPosition)
notifyItemRemoved(removedPosition)
}

}

由于某些原因,
nofityItemRemoved
仅影响已删除的项目,并允许所有后续项目编号不同步。因此,您需要在它之后调用
notifyItemRangeChanged

fun removeItem(viewHolder: RecyclerView.ViewHolder){
    removedPosition = viewHolder.adapterPosition
    removedItem = arrayList[removedPosition]

    arrayList.removeAt(removedPosition)
    notifyItemRemoved(removedPosition)
    notifyItemRangeChanged(removedPosition, arrayList.size)
}
在一个类似的问题上,他说如果你这样做,你会得到一个被移除物品的正确动画,但我没有尝试过:

fun removeItem(viewHolder: RecyclerView.ViewHolder){
    removedPosition = viewHolder.adapterPosition
    removedItem = arrayList[removedPosition]

    arrayList.removeAt(removedPosition)
    notifyItemChanged(removedPosition)
    notifyItemRangeRemoved(removedPosition, 1)
}