You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在RecyclerView中实现拖拽排序与滑动删除?

Hey there! Let's tackle your RecyclerView needs step by step—first, a quick heads-up: your current EmployeesAdapter extends BaseAdapter, which is designed for older widgets like ListView. For RecyclerView, you’ll want to switch to extending RecyclerView.Adapter instead. That’s the base we need to add swipe-to-delete and drag-and-drop reordering.

Step 1: Convert Your Adapter to RecyclerView.Adapter

Here’s how to adjust your existing code to fit RecyclerView’s pattern (I’ll fill in the gaps based on what you shared):

class EmployeesAdapter(
    private val context: Context,
    private var employees: MutableList<EmployeesTest>
) : RecyclerView.Adapter<EmployeesAdapter.ViewHolder>() {

    // ViewHolder class to hold your item views
    inner class ViewHolder(row: View) : RecyclerView.ViewHolder(row) {
        val txtUser: TextView = row.findViewById(R.id.txt_user)
        val userJob: TextView = row.findViewById(R.id.user_job)
        val imgUser: ImageView = row.findViewById(R.id.img_u) // Replace with your actual ImageView ID
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val itemView = LayoutInflater.from(context)
            .inflate(R.layout.your_employee_item_layout, parent, false) // Replace with your item layout ID
        return ViewHolder(itemView)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val employee = employees[position]
        // Bind your data to the views
        holder.txtUser.text = employee.name // Adjust to your EmployeesTest fields
        holder.userJob.text = employee.jobTitle
        // Add image loading logic here (e.g., with Glide/Picasso)
    }

    override fun getItemCount(): Int = employees.size

    // Helper methods to modify data with proper RecyclerView notifications
    fun removeItem(position: Int) {
        employees.removeAt(position)
        notifyItemRemoved(position) // Triggers delete animation
    }

    fun swapItems(fromPosition: Int, toPosition: Int) {
        Collections.swap(employees, fromPosition, toPosition)
        notifyItemMoved(fromPosition, toPosition) // Triggers reorder animation
    }

    fun updateEmployees(newList: List<EmployeesTest>) {
        employees.clear()
        employees.addAll(newList)
        notifyDataSetChanged()
    }
}

Step 2: Add Swipe-to-Delete & Drag Reordering with ItemTouchHelper

You don’t need an external library for this—Android’s official ItemTouchHelper does exactly what you need, and it’s stable. Here’s how to set it up in your Activity/Fragment:

// Initialize your RecyclerView and Adapter first
val recyclerView = findViewById<RecyclerView>(R.id.your_recycler_view_id)
val employeeList = arrayListOf<EmployeesTest>() // Your existing data list
val adapter = EmployeesAdapter(this, employeeList)

// Set layout manager (LinearLayoutManager is most common)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = adapter

// Create the ItemTouchHelper callback
val itemTouchCallback = object : ItemTouchHelper.SimpleCallback(
    // Allow drag up/down for reordering
    ItemTouchHelper.UP or ItemTouchHelper.DOWN,
    // Allow left/right swipe for deletion
    ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
) {
    override fun onMove(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder,
        target: RecyclerView.ViewHolder
    ): Boolean {
        val fromPos = viewHolder.adapterPosition
        val toPos = target.adapterPosition
        // Tell the adapter to swap items
        adapter.swapItems(fromPos, toPos)
        return true
    }

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        val position = viewHolder.adapterPosition
        // Delete the item from the adapter
        adapter.removeItem(position)
        // Add your database/API delete logic here if needed
    }

    // Optional: Customize swipe/drag visual feedback
    override fun onChildDraw(
        c: Canvas,
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder,
        dX: Float,
        dY: Float,
        actionState: Int,
        isCurrentlyActive: Boolean
    ) {
        // You can add custom animations here (e.g., red background when swiping left)
        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
    }
}

// Attach the ItemTouchHelper to your RecyclerView
val itemTouchHelper = ItemTouchHelper(itemTouchCallback)
itemTouchHelper.attachToRecyclerView(recyclerView)

Do You Need a Library?

The official ItemTouchHelper is more than enough for basic swipe-delete and reordering. If you want more advanced features (like swipe-to-reveal menus, complex animations, or multi-select), libraries like FlexibleAdapter or RecyclerView Animators can help—but for your use case, sticking with the official tool is simpler and avoids extra dependencies.

Quick Tips

  • Always use notifyItemRemoved()/notifyItemMoved() instead of notifyDataSetChanged()—they trigger smooth animations and are more efficient.
  • Make sure your EmployeesTest class properly implements equals() and hashCode() if you need to compare items later.
  • If you’re using ViewModel/LiveData to manage your data, update the LiveData list instead of the adapter’s list directly, and let the adapter observe changes.

内容的提问来源于stack exchange,提问作者Heber Solis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:45:26