Android RecyclerView desplazamiento suave para ver que está animando su altura
Tengo un RecyclerView con vistas de niño extensibles, cuando el niño ViewGroup se hace clic que infla una cantidad de vistas que animan la altura de ViewGroup de 0 a la altura medida viewgroup, como el gif siguiente:
- AsyncTask cargando la imagen RecyclerView
- Los fragmentos ViewPager hacen referencia al mismo RecyclerView y / o Adapter
- App fallando al intentar usar RecyclerView en android 5.0
- Implementar el gesto de deslizamiento en un elemento de RecyclerView?
- Cómo hacer un indicador de página para reciclaje horizontal
El problema es: estoy llamando a smoothScrollToPosition en recyclerView, lo desplazamiento suave a la posición de vista, pero se considera la altura de la vista actual, que todavía no se amplía, en el GIF anterior estoy tocando en la vista inferior de la recyclerview, Que no se desplazan a la posición porque la vista ya está visible, pero cuando vuelvo a tocar (llamando a la posición de desplazamiento suave otra vez), desplaza la vista a la posición correcta porque la vista ya está expandida.
¿Hay algún enfoque para desplazar la vista a la parte superior de la pantalla o simplemente desplazarse para que el contenido sea visible?
Para referencias: Este es el método llamado para inflar las vistas:
collapsible_content.removeAllViews(); for(int i = 0; i < 5; i++) { View link_view = getLayoutInflater().inflate(R.layout.list_item_timeline_step_link, collapsible_content, false); TextView text = (TextView) link_view.findViewById(R.id.step_link_text); text.setText("Test"); collapsible_content.addView(link_view); }
Y este es mi método para expandir:
public void toggle() { collapsible_content.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); Animation a; if (mExpanded) { a = new ExpandAnimation(collapsible_content.getLayoutParams().height, 0); } else { a = new ExpandAnimation(collapsible_content.getLayoutParams().height, getMeasuredHeight()); } a.setDuration(mAnimationDuration); collapsible_content.startAnimation(a); mExpanded = !mExpanded; }
Y la animación:
private class ExpandAnimation extends Animation { private final int mStartHeight; private final int mDeltaHeight; public ExpandAnimation(int startHeight, int endHeight) { mStartHeight = startHeight; mDeltaHeight = endHeight - startHeight; } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { final int newHeight = (int) (mStartHeight + mDeltaHeight * interpolatedTime); collapsible_content getLayoutParams().height = newHeight; if (newHeight <= 0) { collapsible_content setVisibility(View.GONE); } else { collapsible_content setVisibility(View.VISIBLE); } collapsible_content requestLayout(); } @Override public boolean willChangeBounds() { return true; } }
- ¿Cómo usar la API fluida de MvvmCross para enlazar TextView de un elemento de RecyclerView a una propiedad de su ViewModel en Android?
- ¿Cómo puedo obtener la posición seleccionada en un RecyclerView?
- PopupMenu no se encuentra correctamente dentro de RecyclerView
- Prueba recyclerView con Espresso, cómo realizar clics o hacer afirmaciones
- Establecer margen en RecyclerView mediante programación
- Clic en el elemento programáticamente en RecyclerView
- Horizontal RecyclerView interior vertical ScrollView
- No se puede escribir un algoritmo para filtrar elementos en un RecyclerView basado en un tiempo guardado con cada elemento
Mi solución fue comprobar constantemente el fondo de la vista dentro del método applyTransformation y compararlo con la altura de RecyclerView, si el fondo es más alto que la altura del RV, puedo desplazarme por los valores de dif:
final int bottom = collapsible_content.getBottom(); final int listViewHeight = mRecyclerView.getHeight(); if (bottom > listViewHeight) { final int top = collapsible_content.getTop(); if (top > 0) { mRecyclerView.smoothScrollBy(0, Math.min(bottom - listViewHeight + mRecyclerView.getPaddingBottom(), top)); } }
El truco era usar Math.min para obtener la vista superior, por lo que no se desplazan hasta hacer la parte superior no visible.
Solución basada en ListViewAnimations
Agregue un animationlistener e inicie el desplazamiento de la recyclerview después de que la animación de expansión haya terminado.
- ¿No debería haber una opción para que Fragmentos retenga los eventos de clic dentro de su jerarquía de vistas?
- Actualizar una página en ionic2