activity kotlin RecyclerView 左滑显示删除按钮 删除item 完整的全部代码实现
时间: 2023-11-29 20:06:31 浏览: 40
以下是一个基本的实现:
1. 创建一个 RecyclerView。
2. 创建一个 Adapter,将数据和 ViewHolder 绑定在一起。
3. 在 ViewHolder 类中添加一个 SwipeLayout,它将包含一个删除按钮和内容视图。
4. 在 Adapter 中实现 ItemTouchHelper.Callback 接口,以便可以监听 RecyclerView 上的滑动事件。
5. 在 onSwiped 方法中,删除被滑动的项目。
以下是完整的代码实现:
1. 创建 RecyclerView:
```
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
```
2. 创建 Adapter:
```
class MyAdapter(private val items: List<String>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(items[position])
}
override fun getItemCount() = items.size
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val swipeLayout: SwipeLayout = itemView.findViewById(R.id.swipe_layout)
private val textView: TextView = itemView.findViewById(R.id.text_view)
private val deleteButton: Button = itemView.findViewById(R.id.delete_button)
fun bind(item: String) {
textView.text = item
deleteButton.setOnClickListener {
items.toMutableList().removeAt(adapterPosition)
notifyItemRemoved(adapterPosition)
}
swipeLayout.addSwipeListener(object : SimpleSwipeListener() {
override fun onOpen(layout: SwipeLayout) {
super.onOpen(layout)
closeAllItems()
swipeLayout.open(true)
}
})
}
private fun closeAllItems() {
for (i in 0 until itemCount) {
(recyclerView.findViewHolderForAdapterPosition(i) as? ViewHolder)?.swipeLayout?.close(true)
}
}
}
}
```
3. 创建 item_layout.xml 文件:
```
<?xml version="1.0" encoding="utf-8"?>
<com.daimajia.swipe.SwipeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:swipe="http://schemas.android.com/apk/res-auto"
android:id="@+id/swipe_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
swipe:sensitivity="0.2"
swipe:show_mode="pull_out"
swipe:leftEdgeSwipeOffset="0dp"
swipe:rightEdgeSwipeOffset="0dp"
swipe:leftSwipeEnabled="false"
swipe:rightSwipeEnabled="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="16dp">
<TextView
android:id="@+id/text_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="18sp" />
<Button
android:id="@+id/delete_button"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@color/red"
android:text="@string/delete"
android:textColor="@color/white" />
</LinearLayout>
</com.daimajia.swipe.SwipeLayout>
```
4. 实现 ItemTouchHelper.Callback 接口:
```
class SwipeToDeleteCallback(private val adapter: MyAdapter) : ItemTouchHelper.Callback() {
override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
return makeMovementFlags(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT)
}
override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
adapter.items.toMutableList().removeAt(viewHolder.adapterPosition)
adapter.notifyItemRemoved(viewHolder.adapterPosition)
}
override fun isLongPressDragEnabled() = false
override fun isItemViewSwipeEnabled() = true
}
```
5. 在 Activity 或 Fragment 中实现:
```
class MainActivity : AppCompatActivity() {
private lateinit var recyclerView: RecyclerView
private lateinit var adapter: MyAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recyclerView = findViewById(R.id.recycler_view)
adapter = MyAdapter(listOf("Item 1", "Item 2", "Item 3"))
recyclerView.adapter = adapter
val itemTouchHelper = ItemTouchHelper(SwipeToDeleteCallback(adapter))
itemTouchHelper.attachToRecyclerView(recyclerView)
}
}
```