如何在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 ofnotifyDataSetChanged()—they trigger smooth animations and are more efficient. - Make sure your
EmployeesTestclass properly implementsequals()andhashCode()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

