En muchas ocasiones los elementos de un recyclerView deben ser eliminados con su consiguiente eliminación de base de datos o de la fuente de los mismos. Esto se puede hacer mediante una pulsación o se puede hacer un efecto de swip (arrastrado lateral) mostrando un icono que indica la acción. Este ejemplo de Recycler View con eliminación mediante swip muestra esta funcionalidad. Para ello se utiliza un objeto de tipo llamado ItemTouchHelper que permite actuar mediante una pulsación en un elemento mediante una interfaz de callback.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recyclerView"/>

</LinearLayout>

El layout perteneciente al ítem del recyclerView debe tener dos partes: una frontal que muestra el elemento y una posterior que muestra lo que se verá al hacer un swip

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/fondo_item"
        android:gravity="center_vertical|end"
        android:background="@android:color/holo_red_light">

        <ImageView
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:gravity="center_vertical"
            android:src="@android:drawable/ic_menu_delete"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/principal_item"
        android:background="@android:color/white">

        <ImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:id="@+id/imagenItem"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:textSize="30sp"
            android:id="@+id/nombreItem"/>

    </LinearLayout>

</FrameLayout>

En cuanto a las clases .java se deben realizar las siguientes

public class AdaptadorRecycler extends RecyclerView.Adapter<AdaptadorRecycler.Holder> {

    List<Elemento> lista;
    Context context;

    public AdaptadorRecycler(Context context, List list) {
        this.context = context;
        this.lista = list;
    }

    @NonNull
    @Override
    public Holder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(context).inflate(R.layout.item_recycler,viewGroup,false);
        return new Holder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull Holder holder, int i) {
        holder.getImagen().setImageResource(lista.get(i).getImagen());
        holder.getNombre().setText(lista.get(i).getNombre());
    }

    @Override
    public int getItemCount() {
        return lista.size();
    }

    public void eliminarElemento(int n){
        lista.remove(n);
        notifyDataSetChanged();
    }

    public class Holder extends RecyclerView.ViewHolder{

        ImageView imagen;
        TextView nombre;
        LinearLayout fondoFront, fondoBack;

        public Holder(@NonNull View itemView) {
            super(itemView);
            imagen = itemView.findViewById(R.id.imagenItem);
            nombre = itemView.findViewById(R.id.nombreItem);
            fondoBack = itemView.findViewById(R.id.fondo_item);
            fondoFront = itemView.findViewById(R.id.principal_item);
        }

        public ImageView getImagen() {
            return imagen;
        }

        public TextView getNombre() {
            return nombre;
        }

        public LinearLayout getFondoFront() {
            return fondoFront;
        }

        public LinearLayout getFondoBack() {
            return fondoBack;
        }
    }

}

La clase que maneja el movimiento lateral debe extender de ItemTouchHelper.SimpleCallback

public class AdaptadorRecyclerItemSwip extends ItemTouchHelper.SimpleCallback {
    private RecyclerItemTouchHelperListener listener;

    public AdaptadorRecyclerItemSwip(int dragDirs, int swipeDirs, RecyclerItemTouchHelperListener listener) {
        super(dragDirs, swipeDirs);
        this.listener = listener;
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        return true;
    }

    @Override
    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
        if (viewHolder != null) {
            final View foregroundView = ((AdaptadorRecycler.Holder) viewHolder).fondoFront;

            getDefaultUIUtil().onSelected(foregroundView);
        }
    }

    @Override
    public void onChildDrawOver(Canvas c, RecyclerView recyclerView,
                                RecyclerView.ViewHolder viewHolder, float dX, float dY,
                                int actionState, boolean isCurrentlyActive) {
        final View foregroundView = ((AdaptadorRecycler.Holder) viewHolder).fondoBack;
        getDefaultUIUtil().onDrawOver(c, recyclerView, foregroundView, dX, dY,
                actionState, isCurrentlyActive);
    }

    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        final View foregroundView = ((AdaptadorRecycler.Holder) viewHolder).fondoFront;
        getDefaultUIUtil().clearView(foregroundView);
    }

    @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView,
                            RecyclerView.ViewHolder viewHolder, float dX, float dY,
                            int actionState, boolean isCurrentlyActive) {
        final View foregroundView = ((AdaptadorRecycler.Holder) viewHolder).fondoFront;

        getDefaultUIUtil().onDraw(c, recyclerView, foregroundView, dX, dY,
                actionState, isCurrentlyActive);
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        listener.onSwiped(viewHolder, direction, viewHolder.getAdapterPosition());
    }

    @Override
    public int convertToAbsoluteDirection(int flags, int layoutDirection) {
        return super.convertToAbsoluteDirection(flags, layoutDirection);
    }

    public interface RecyclerItemTouchHelperListener {
        void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position);
    }
}

La interfaz creada con el método onSwiped() se ejecutará en la actividad donde esté el recycler

public class MainActivity extends AppCompatActivity implements AdaptadorRecyclerItemSwip.RecyclerItemTouchHelperListener {

    RecyclerView recyclerView;
    AdaptadorRecycler a;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = findViewById(R.id.recyclerView);
        ArrayList<Elemento> lista = new ArrayList();
        lista.add(new Elemento(R.drawable.donk, "Donky Kong"));
        lista.add(new Elemento(R.drawable.kratos, "God of War"));
        lista.add(new Elemento(R.drawable.sonic, "Sonic"));
        lista.add(new Elemento(R.drawable.startfox, "Fox"));
        lista.add(new Elemento(R.drawable.street, "Street Figther"));
        a = new AdaptadorRecycler(getApplicationContext(),lista);
        recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(),LinearLayoutManager.VERTICAL,false));
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
        recyclerView.setAdapter(a);
        ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new AdaptadorRecyclerItemSwip(0, ItemTouchHelper.LEFT, this);
        new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView);
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position) {
        if (viewHolder instanceof AdaptadorRecycler.Holder){
            String nombre = a.lista.get(viewHolder.getAdapterPosition()).getNombre();
            a.eliminarElemento(viewHolder.getAdapterPosition());

        }
    }
}

Para asociar el recycler con el adaptador del movimiento lateral se utiliza el método attachToRecyclerView de la propia clase

ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new AdaptadorRecyclerItemSwip(0, ItemTouchHelper.LEFT, this);
        new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView);