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:

ejemplo

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; } } 

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.

  • Biblioteca avanzada de RecyclerView - ejemplos de código
  • Multiple RecyclerView en un fragmento
  • Cómo importar RecyclerView para Android L-preview
  • Android RecyclerView con SectionIndexer
  • ¿Cómo obtener información sobre el toque de RecyclerView?
  • Attr / colorError error no encontrado al usar com.android.support:recyclerview-v7:26.0.0-beta2
  • ¿Cómo utilizar ItemAnimator en un RecyclerView?
  • Error al inflar la clase RecyclerView
  • ¿Qué es la contraparte de RecyclerView.Adapter de ListView.Adpater.isEnabled ()
  • Android RecyclerView que se encuentra en un fragmento que se encuentra en un ViewPager no vuelve a cargar / refrescar las vistas si se alcanza el setOffscreenPageLimit
  • RecyclerView encabezado y pie de página
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.