Solía usar la biblioteca SwipeToDismiss , pero ahora estoy tratando de migrar a RecyclerView y las cosas no son tan obvias, ¿conoce algún reemplazo para esta biblioteca? ¿Alguna idea de cómo implementarlo desde cero?
Solía usar la biblioteca SwipeToDismiss , pero ahora estoy tratando de migrar a RecyclerView y las cosas no son tan obvias, ¿conoce algún reemplazo para esta biblioteca? ¿Alguna idea de cómo implementarlo desde cero?
Respuestas:
A partir de la v22.2.0, el equipo de soporte de Android ha incluido una ItemTouchHelper
clase que hace que deslizar para descartar y arrastrar y soltar sea bastante simple. Es posible que esto no sea tan completo como algunas de las bibliotecas que existen, pero proviene directamente del equipo de Android.
Actualice su build.gradle para importar v22.2. + De la biblioteca RecyclerView
compile 'com.android.support:recyclerview-v7:22.2.+'
Cree una instancia de ItemTouchHelper con un SimpleCallback apropiado
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
[...]
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
//Remove swiped item from list and notify the RecyclerView
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
** Tenga en cuenta que SimpleCallback toma las direcciones en las que desea habilitar la función de arrastrar y soltar y las direcciones en las que desea habilitar el deslizamiento.
Adjuntar a su RecyclerView
itemTouchHelper.attachToRecyclerView(recyclerView);
viewHolder
.
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
final int position = viewHolder.getAdapterPosition(); //get position which is swipe
if (direction == ItemTouchHelper.LEFT) { //if swipe left
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); //alert for confirm to delete
builder.setMessage("Are you sure to delete?"); //set message
builder.setPositiveButton("REMOVE", new DialogInterface.OnClickListener() { //when click on DELETE
@Override
public void onClick(DialogInterface dialog, int which) {
adapter.notifyItemRemoved(position); //item removed from recylcerview
sqldatabase.execSQL("delete from " + TABLE_NAME + " where _id='" + (position + 1) + "'"); //query for delete
list.remove(position); //then remove item
return;
}
}).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { //not removing items if cancel is done
@Override
public void onClick(DialogInterface dialog, int which) {
adapter.notifyItemRemoved(position + 1); //notifies the RecyclerView Adapter that data in adapter has been removed at a particular position.
adapter.notifyItemRangeChanged(position, adapter.getItemCount()); //notifies the RecyclerView Adapter that positions of element in adapter has been changed from position(removed element index to end of list), please update it.
return;
}
}).show(); //show alert dialog
}
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(recyclerView); //set swipe to recylcerview
Aquí en Code, si el usuario desliza el dedo hacia la izquierda, se muestra AlertDialog y si el usuario selecciona REMOVE, el elemento se elimina de la base de datos y la vista de reciclaje se actualiza y si el usuario selecciona CANCELAR, la vista de reciclaje es como está.
if (direction == ItemTouchHelper.LEFT) // if swipe left
ya que ItemTouchHelper.SimpleCallback
se limita solo a esa dirección de deslizamiento. Si desea deslizar hacia la izquierda y hacia la derecha, ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT)
deberá verificar la dirección.
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);builder.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { // stuff to put the item back } });
adapter.notifyItemChanged(position);
que devolví el artículo deslizado, en lugar de notifyItemRemoved
, lo cual es más lógico en mi humilde opinión.
tal vez podrías probar esta biblioteca:
https://github.com/daimajia/AndroidSwipeLayout
Actualización: acabo de encontrar otra buena biblioteca que puede usar con RecyclerView:
Esta biblioteca puede ser útil . Puede implementar undo
en OnDissmiss
usosupertoast
OnTouchListener
inspiración para esto
Escribí la biblioteca SwipeToDeleteRV que admite la función de deslizar para eliminar y deshacer en las vistas de reciclador. Se basa en ItemTouchHelper y es muy fácil de usar.
Espero que pueda ser útil para alguien que enfrenta los mismos problemas.
Como ejemplo, puede definir su vista de reciclador en un diseño XML como normal, más algunos atributos opcionales:
...
xmlns:stdrv="http://schemas.android.com/apk/res-auto"
...
<io.huannguyen.swipetodeleterv.STDRecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
stdrv:border_color="@android:color/darker_gray" // specify things like border color, border width, etc.
stdrv:delete_view_background="#cccccc"
stdrv:delete_icon="@drawable/ic_archive"
stdrv:delete_icon_height="24dp"
stdrv:delete_icon_width="24dp"
stdrv:left_delete_icon_margin="32dp"
stdrv:delete_message="@string/delete_message"
stdrv:right_delete_icon_margin="32dp"
stdrv:delete_icon_color="#000000"
stdrv:has_border="true"/>
Todos los atributos stdrv son opcionales. Si no los especifica, se usarán los predeterminados.
Luego cree un adaptador que subclases STDAdapter, asegúrese de llamar al constructor de superclase. Algo como esto:
public class SampleAdapter extends STDAdapter<String> {
public SampleAdapter(List<String> versionList) {
super(versionList);
}
}
A continuación, asegúrese de realizar una llamada al setupSwipeToDelete
método para configurar la función de deslizar para eliminar.
mRecyclerView.setupSwipeToDelete(your_adapter_instance, swipe_directions);
swipe_directions
es la dirección en la que permite que se pasen los elementos.
Ejemplo:
// Get your recycler view from the XML layout
mRecyclerView = (STDRecyclerView) findViewById(R.id.recycler_view);
LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
mRecyclerView.setLayoutManager(layoutManager);
mAdapter = new SampleAdapter(versions);
// allow swiping in both directions (left-to-right and right-to-left)
mRecyclerView.setupSwipeToDelete(mAdapter, ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT);
¡Eso es! Para configuraciones más avanzadas (es decir, establecer diferentes mensajes de eliminación para diferentes elementos, eliminar elementos temporal y permanentemente, ...), consulte la página Léame del proyecto.