我在 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)
}
}
}
我通过在notifyItemRemoved()之前调用
holder.setIsRecyclable(true)
解决了这个问题