android - recyclerview - NestedScrollView y CoordinatorLayout. Problema en el desplazamiento
com.android.support:appcompat-v7 last version (5)
Creo que no es un error en el soporte lib, solo usa esto
<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:layout_gravity="fill_vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
Tengo un problema extraño con CoordinatorLayout
y NestedScrollView
(con la biblioteca de soporte de diseño 22.2.0)
Usando un contenido más pequeño que NestedScrollView
, debería tener un contenido fijo. Sin embargo, al tratar de desplazarme hacia arriba y hacia abajo por el contenido, puedo obtener que el contenido se desplace y nunca más vuelva a estar en su lugar.
Aquí una pequeña muestra:
Aquí el código:
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_scrollFlags="scroll|enterAlways" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<FrameLayout
android:paddingTop="24dp"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/padding">
</FrameLayout>
</android.support.v4.widget.NestedScrollView>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:visibility="gone"
android:src="@drawable/ic_done" />
</android.support.design.widget.CoordinatorLayout>
El método onMeasureChild () se llama muchas veces durante el proceso de diseño. Aparentemente, la clave es obtener un valor distinto de cero para la altura del niño al principio del proceso. ScrollingViewBehavior no puede hacerlo en lo siguiente:
int scrollRange = appBar.getTotalScrollRange();
int height = parent.getHeight()
- appBar.getMeasuredHeight()
+ scrollRange;
FixedScrollingviewBehavior corrige esto con:
int height = parent.getHeight()
- appBar.getMeasuredHeight()
+ Math.min(scrollRange, parent.getHeight() - heightUsed);
que muy temprano le da a la altura el valor de -128, la altura de la barra de la aplicación.
Una alternativa, cercana al original es:
int height = parent.getMeasuredHeight()
- appBar.getMeasuredHeight()
+ scrollRange;
Esto también se puede observar en la demostración de cheesesquare cuando se eliminan todas menos una tarjeta en el fragmento de detalles.
Pude resolver esto (por ahora) usando esta clase: https://gist.github.com/EmmanuelVinas/c598292f43713c75d18e
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="com.evs.demo.layout.FixedScrollingViewBehavior">
.....
</android.support.v4.widget.NestedScrollView>
Podría llegar tarde con mi respuesta, pero aquí va. Estaba teniendo un problema similar, pero ninguna de las soluciones mencionadas me funcionó. Al final lo arreglé usando la versión 23 de la biblioteca de soporte.
...
compileSdkVersion 23
...
targetSdkVersion 23
...
compile ''com.android.support:appcompat-v7:23.1.0''
compile ''com.android.support:support-v4:23.1.0''
compile ''com.android.support:design:23.1.0''
android:layout_gravity="fill_vertical"
funcionó para mí también.