SwipeRefreshLayout pull varias veces comportamiento (SDK 23)

Tengo SwipeRefreshLayout como esto:

.xml :

 <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swipe_refresh_layout" android:layout_width="match_parent" android:layout_height="wrap_content" > <android.support.v7.widget.RecyclerView android:id="@+id/haberRecyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v4.widget.SwipeRefreshLayout> 

.java :

 private SwipeRefreshLayout swipeLayout; swipeLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_refresh_layout); swipeLayout.setColorSchemeColors(getResources().getColor(R.color.primary_color)); swipeLayout.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { refreshContent(); } }); 

Esto me permite tirar swipeRefresh varias veces y la animación circular se vuelve raro, a veces se queda en la pantalla sin circular:

Introduzca aquí la descripción de la imagen

En el primer tirón aparece un poco en la parte superior, en el segundo tirón que baja un poco más como en la imagen.

¿Cómo deshabilitar múltiples pull en SwipeRefresh mientras ya está actualizando? Supongo que esto no sucede por debajo de sdk 23. Estoy usando buildTool 23, targetSdk 23, support-v4: 23, appcompat-v7: 23.

Actualización: esto no sucede si uso ListView lugar de RecyclerView .

Este problema se presentó en support-v4 23.0.0 y es causado por la nueva funcionalidad de desplazamiento anidado sin comprobar ifRefreshing ().

Debe extender SwipeRefreshLayout y anular la función onStartNestedScroll:

 @Override public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) { return !isRefreshing() && super.onStartNestedScroll(child, target, nestedScrollAxes); } 

"Support-v4: 23.1.0" ya arregló este error.

Agregue una variable booleana para revisar su lista para actualizar en este momento.

 if (!refreshing) refreshContent(); 

SwipeRefreshLayout subclasificar SwipeRefreshLayout proporcionando su implementación personalizada de canChildScrollUp()

  @Override public boolean canChildScrollUp() { if (isRefreshing()) { return true; } return false; } 

Por supuesto usted debe comprobar si su opinión del reciclar está demostrando ya su primer niño y devolver un valor por consiguiente

Parece un error en la biblioteca de soporte appcompat-v7 que se introdujo en la versión 23.0.0. Como solución, puede desactivar SwipeRefreshLayout en OnRefreshListener # onRefresh callback y habilitarlo nuevamente cuando se carguen datos:

 private class MyOnRefreshListener implements SwipeRefreshLayout.OnRefreshListener { @Override public void onRefresh() { swipeRefreshLayout.setEnabled(false); load(); } private void onLoaded() { swipeRefreshLayout.setEnabled(true); swipeRefreshLayout.setRefreshing(false); } } 

Debes llamar a mSwipeRefreshLayout.stopRefreshing () cuando termines de actualizar tus datos.

 public void refreshContent() { ... //end of your "refresh" code if(mSwipeRefreshLayout.isRefreshing()) mSwipeRefreshLayout.stopRefreshing() } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.