programacion - Vista de Lista de Android Arrastrar y Soltar
manual de programacion android pdf (5)
Ahora es bastante fácil de implementar para RecyclerView
con ItemTouchHelper . Simplemente anule el método ItemTouchHelper.Callback
de ItemTouchHelper.Callback
:
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
mMovieAdapter.swap(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
Un buen tutorial sobre esto se puede encontrar en medium.com: Arrastrar y deslizar con RecyclerView
Tengo una lista de registros en una vista de lista que quiero que el usuario pueda volver a ordenar usando un método de arrastrar y soltar. He visto esto implementado en otras aplicaciones, pero no he encontrado un tutorial para él. Debe ser algo que los demás también necesitan. ¿Alguien puede indicarme algún código para hacer esto?
Descubrí que github.com/bauerca/drag-sort-listview funcionaba bien, aunque comenzar con él podría haber sido más fácil. Aquí hay un breve tutorial sobre cómo usarlo en Android Studio con una lista en memoria:
Agregue esto a las dependencias de
build.gradle
para su aplicación:compile ''asia.ivity.android:drag-sort-listview:1.0'' // Corresponds to release 0.6.1
Cree un recurso para el ID del identificador de arrastre creando o agregando
values/ids.xml
:<resources> ... possibly other resources ... <item type="id" name="drag_handle" /> </resources>
Cree un diseño para un elemento de la lista que incluya su imagen favorita del controlador de arrastre y asigne su ID a la ID que creó en el paso 2 (por ejemplo,
drag_handle
).Cree un diseño DragSortListView, algo como esto:
<com.mobeta.android.dslv.DragSortListView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:dslv="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" dslv:drag_handle_id="@id/drag_handle" dslv:float_background_color="@android:color/background_light"/>
Establezca una derivada de
ArrayAdapter
con una anulación degetView
que represente su vista de elemento de lista.final ArrayAdapter<MyItem> itemAdapter = new ArrayAdapter<MyItem>(this, R.layout.my_item, R.id.my_item_name, items) { // The third parameter works around ugly Android legacy. http://.com/a/18529511/145173 @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); MyItem item = getItem(position); ((TextView) view.findViewById(R.id.my_item_name)).setText(item.getName()); // ... Fill in other views ... return view; } }; dragSortListView.setAdapter(itemAdapter);
Establezca un escucha de caída que reorganiza los elementos a medida que se eliminan.
dragSortListView.setDropListener(new DragSortListView.DropListener() { @Override public void drop(int from, int to) { MyItem movedItem = items.get(from); items.remove(from); if (from > to) --from; items.add(to, movedItem); itemAdapter.notifyDataSetChanged(); } });
DragListView lib hace esto realmente ordenado con un soporte muy bueno para animaciones personalizadas como animaciones de elevación. También se mantiene y actualiza regularmente.
Aquí es cómo lo usa:
1: agregue la lib para gradle primero
dependencies {
compile ''com.github.woxthebox:draglistview:1.2.1''
}
2: Agregar lista desde xml
<com.woxthebox.draglistview.DragListView
android:id="@+id/draglistview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
3: configurar el oyente de arrastre
mDragListView.setDragListListener(new DragListView.DragListListener() {
@Override
public void onItemDragStarted(int position) {
}
@Override
public void onItemDragEnded(int fromPosition, int toPosition) {
}
});
4: crear un adaptador anulado desde DragItemAdapter
public class ItemAdapter extends DragItemAdapter<Pair<Long, String>, ItemAdapter.ViewHolder>
public ItemAdapter(ArrayList<Pair<Long, String>> list, int layoutId, int grabHandleId, boolean dragOnLongPress) {
super(dragOnLongPress);
mLayoutId = layoutId;
mGrabHandleId = grabHandleId;
setHasStableIds(true);
setItemList(list);
}
5: Implementar un visor que se extiende desde DragItemAdapter.ViewHolder
public class ViewHolder extends DragItemAdapter.ViewHolder {
public TextView mText;
public ViewHolder(final View itemView) {
super(itemView, mGrabHandleId);
mText = (TextView) itemView.findViewById(R.id.text);
}
@Override
public void onItemClicked(View view) {
}
@Override
public boolean onItemLongClicked(View view) {
return true;
}
}
Para obtener información más detallada, vaya a https://github.com/woxblom/DragListView
Estoy agregando esta respuesta para los que buscan en Google sobre esto ...
Hubo un episodio de DevBytes ( ListView Cell Dragging and Rearranging ) recientemente que explica cómo hacer esto
Puede encontrarlo aquí también, el código de muestra está disponible here .
Lo que básicamente hace este código es que crea una vista de lista dynamic listview
mediante la extensión de la vista de lista que admite el arrastre e intercambio de celdas. Para que pueda usar DynamicListView
lugar de su ListView
básico y eso es todo, ha implementado un ListView con Arrastrar y soltar.
He estado trabajando en esto desde hace un tiempo. Es difícil acertar, y no pretendo que lo haga, pero estoy contento con eso hasta ahora. Mi código y varias demos se pueden encontrar en
Su uso es muy similar al TouchInterceptor (en el que se basa el código), aunque se han realizado cambios significativos en la implementación.
DragSortListView tiene un desplazamiento suave y predecible al arrastrar y mezclar elementos. Las combinaciones de elementos son mucho más consistentes con la posición del elemento que arrastra / flota. Los artículos de la lista de altura heterogénea son compatibles. El desplazamiento por arrastre es personalizable (demuestro un desplazamiento rápido de arrastre a través de una larga lista, aunque no se trata de una aplicación). Los encabezados / pies de página son respetados. etc. ?? Echar un vistazo.