ItemTouchHelper 项目在长按后无法正确删除

问题描述 投票:0回答:1

我在 RecyclerView 上遇到问题,应通过单击删除元素: 当我将 ItemTouchHelper 附加到 RecyclerView 以将项目拖放到列表中,并长按某个项目而不将其拖动到新位置时,该项目将从我的列表中删除,并且 getItemCount 返回 0,但该元素仍然可见,就像它会被钉住一样。当添加其他项目时,它会被简单地覆盖。 唯一的解决方案是在视图上设置一个 LongClickListener,这也会在单击时删除该元素,但我认为这不是一个好的解决方案。我该如何解决这个问题?

我的代码:

主要活动:

class MainActivity : AppCompatActivity() {
    @SuppressLint("MissingInflatedId")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val recyclerView = findViewById<RecyclerView>(R.id.recView)
        recyclerView.layoutManager = LinearLayoutManager(this)
        val myAdapter = MyAdapter(layoutInflater,mutableListOf("A","B","C","D","E","F")){items,position->
            items.removeAt(position)
            recyclerView.adapter?.notifyItemRemoved(position)
        }
        recyclerView.adapter =  myAdapter
        val myItemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP or ItemTouchHelper.DOWN,0){
            override fun onMove(
                recyclerView: RecyclerView,
                viewHolder: ViewHolder,
                target: ViewHolder
            ): Boolean {
                val item = myAdapter.items[viewHolder.adapterPosition]
                myAdapter.items.removeAt(viewHolder.adapterPosition)
                myAdapter.items.add(target.adapterPosition,item)
                recyclerView.adapter?.notifyItemMoved(viewHolder.adapterPosition,target.adapterPosition)
                return true
            }

            override fun onSwiped(viewHolder: ViewHolder, direction: Int) {
            }

        })
        myItemTouchHelper.attachToRecyclerView(recyclerView)
    }
}

我的适配器:

class MyAdapter(val layoutInflater: LayoutInflater, val items: MutableList<String>,val onItemClicked: (items: MutableList<String>,position: Int)->Unit): RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    class MyViewHolder(view: View): ViewHolder(view){
        val textView = view.findViewById<TextView>(R.id.textview)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        return MyViewHolder(layoutInflater.inflate(R.layout.list_item,parent,false))
    }

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

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.textView.text = items[position]
        holder.textView.setOnClickListener{
            onItemClicked(items,holder.adapterPosition)
        }
    }
}
android android-recyclerview itemtouchhelper
1个回答
0
投票

我通过在notifyItemRemoved()之前调用

holder.setIsRecyclable(true)
解决了这个问题

© www.soinside.com 2019 - 2024. All rights reserved.