java - soltar - como mover un jframe undecorated
cómo usar arrastrar y soltar en la vista de reciclador usando la base de datos en tiempo real de firebase (2)
Tuve un problema similar y he hecho lo siguiente (suponiendo que esté utilizando una clase que amplía ItemTouchHelper.SimpleCallback, por ejemplo, RecyclerViewTouchHelper):
1) Agregue una propiedad a su hijo de Firebase para registrar su orden en la lista (por ejemplo, "orderNumber").
2) Modifique el método onMove () de su RecyclerViewTouchHelper para incluir lo siguiente:
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
final int firstPosition = viewHolder.getAdapterPosition();;
final int secondPosition = target.getAdapterPosition();
DatabaseReference firstItemRef = mMovieAdapter.getRef(viewHolder.getAdapterPosition());
DatabaseReference secondItemRef = mMovieAdapter.getRef(target.getAdapterPosition());
HashMap<String, Object> updateFirstItemOrderNumber = new HashMap<>();
updateFirstItemOrderNumber.put("orderNumber", secondPosition);
firstItemRef.updateChildren(updateFirstItemOrderNumber);
HashMap<String, Object> updateSecondItemOrderNumber = new HashMap<>();
updateSecondItemOrderNumber.put("orderNumber", firstPosition);
secondItemRef.updateChildren(updateSecondItemOrderNumber);
return false;
}
3) Al crear su RecyclerViewAdapter, asegúrese de que la consulta que utiliza esté ordenada por ordernumber, por ejemplo
Query orderedListQuery = FirebaseRef.orderByChild("orderNumber");
¡Espero que esto ayude!
Estoy tratando de implementar la característica de arrastrar y soltar a la vista de reciclador de Firebase. No hay suficiente información en los documentos para esta implementación. Supongo que tengo que usar onchildmoved para el oyente del evento, pero no sé cómo reordenar los datos.
Tuve bastante confusión tratando de hacer que esto funcione para mí en Firebase UI 3.1.0. Aquí está mi solución de trabajo final (explicación a continuación):
// overrides from ItemTouchHelper
override fun onMove(recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder): Boolean {
val fromPos = viewHolder.adapterPosition
val toPos = target.adapterPosition
val fromSnapshot = snapshots.first { it.order == fromPos }
val toSnapshot = snapshots.first { it.order == toPos }
Logger.d("Habit ${fromSnapshot.name} (${fromSnapshot.order}) to $toPos")
Logger.d("Habit ${toSnapshot.name} (${toSnapshot.order}) to $fromPos")
fromSnapshot.order = toPos
toSnapshot.order = fromPos
hasDragged = true
notifyItemMoved(toPos, fromPos)
return true
}
// overrides from FirebaseRecyclerAdapter
override fun onChildChanged(type: ChangeEventType?, snapshot: DataSnapshot?, newIndex: Int, oldIndex: Int) {
when (type) {
ChangeEventType.MOVED -> if (!hasDragged) {
super.onChildChanged(type, snapshot, newIndex, oldIndex)
}
else -> super.onChildChanged(type, snapshot, newIndex, oldIndex)
}
}
override fun onDataChanged() {
hasDragged = false
}
Es posible que esté haciendo algo mal, pero parece que esta respuesta anterior al código duplicó el esfuerzo ya que FirebaseRecyclerAdapter y las instantáneas observables se actualizarán automágicamente en la notificación. Esto provocó que el arrastre terminara abruptamente con nuevos valores. También estaba obteniendo números de pedido incorrectos (probablemente mi culpa) usando getSnapshots (). Get (pos) (instantáneas [desde Píos] en kotlin). Esto causó algunas animaciones realmente extrañas. Además, cuando notificaba sobre la marcha, tenía que invertir las posiciones hacia / desde (destino / vista). Sin embargo, tenga en cuenta que esto depende de ordenar en la consulta usando el campo de orden. Y, por último, no quiero permitir que el método FirebaseRecyclerAdapter # onChildChanged llame si se debe a un arrastre del usuario, que también causa animación no deseada y esfuerzo duplicado.