java - recyclerview - Determine la vista que aparece en el diseño previo de LayoutManager
recyclerview set item animator (1)
No sabe qué elementos serán visibles, pero sabe qué elementos se eliminarán (o cambiarán), de modo que, en función de eso, puede estimar cuánto espacio se necesita en qué dirección. Puede consultar el código de LinearLayoutManager para ver cómo funciona. También puede leer estos artículos sobre los detalles del sistema RecyclerView.
http://www.birbit.com/recyclerview-animations-part-1-how-animations-work http://www.birbit.com/recyclerview-animations-part-2-behind-the-scenes
Quiero apoyar las animaciones predictivas en mi LayoutManager personalizado cuando el elemento se mueve desde fuera de los límites de la pantalla visible al punto visible.
Todas las operaciones de llenado que hago en onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state)
.
De acuerdo con una documentación que admite animaciones predictivas en la etapa de diseño state.isPreLayout()
( state.isPreLayout()
), debo configurar las condiciones iniciales para la animación de cambio (por ejemplo, colocar vistas que aparezcan en algún lugar)
El problema es que no puedo encontrar una manera de determinar en el diseño previo qué vistas van a moverse desde el exterior, porque puedo operar solo con las vistas actuales de RecyclerView y onItemsMoved(RecyclerView recyclerView, int from, int to, int itemCount)
método onItemsMoved(RecyclerView recyclerView, int from, int to, int itemCount)
se llama después de la etapa de diseño previo. (Por ejemplo onItemsRemoved se llama antes del diseño previo)
¿Es el error con LayoutManager
o podría de alguna manera determinar en el diseño previo qué vistas se LayoutManager
pronto?
PD: puedo mantener la animación de predicción desde el punto visible al exterior, porque puedo recorrer las vistas visibles y determinar con recycler.convertPreLayoutPositionToPostLayout
cuáles se moverán.
//childViews is an iterable over RecyclerView items
for (View view : childViews) {
RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) view.getLayoutParams();
boolean probablyMovedFromScreen = false;
if (!lp.isItemRemoved()) {
//view won''t be removed, but maybe it is moved offscreen
int pos = lp.getViewLayoutPosition();
//start view is a first visible view on screen
int lowestPosition = getPosition(startView);
int highestPosition = getPosition(endView);
pos = recycler.convertPreLayoutPositionToPostLayout(pos);
probablyMovedFromScreen = pos < lowestPosition || pos > highestPosition;
}
if (probablyMovedFromScreen) {
//okay this view is going to be moved
}
}
Este artículo me ha ayudado mucho, pero tampoco describe una animación que necesito.
PPS: LinearLayoutManager tampoco es compatible con dicha animación. (solo hay una simple animación de fundido de entrada)