Cómo ajustar la distancia de golpe hacia abajo en SwipeRefreshLayout?

Implementé SwipeRefreshLayout en mi aplicación. Tengo que cambiar la altura que tiene que ser desplazado hacia abajo para llamar al método onRefresh (). ¿Qué método debo usar para agregar una altura personalizada?

Implementación de SwipeRefreshLayout

private SwipeRefreshLayout swipeLayout; 

En crecer

 swipeLayout = (SwipeRefreshLayout)view.findViewById(R.id.swipe_container); swipeLayout.setOnRefreshListener(this); swipeLayout.setColorScheme(android.R.color.holo_blue_dark, android.R.color.holo_green_dark, android.R.color.holo_purple, android.R.color.holo_orange_dark); swipeLayout.setSoundEffectsEnabled(true); 

Implementar un AsyncTask en el método onrefresh

  @Override public void onRefresh() { // Asynctask to perform some task } 

Si está usando la API 21 de la biblioteca de soporte, consulte y por favor hágale saber la respuesta de Han He aquí . Existe un método para establecer la distancia de disparo llamada setDistanceToTriggerSync .


Antes de la API 21, como se mencionó anteriormente, no hay métodos públicos o internos para modificar la distancia de disparo.

Sin embargo, si no desea conservar una copia de las clases para modificar las constantes, puede utilizar la reflexión para establecer manualmente una distancia de disparo.

 swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container); // define a distance Float mDistanceToTriggerSync = yourCalculation(); try { // Set the internal trigger distance using reflection. Field field = SwipeRefreshLayout.class.getDeclaredField("mDistanceToTriggerSync"); field.setAccessible(true); field.setFloat(swipeLayout, mDistanceToTriggerSync); } catch (Exception e) { e.printStackTrace(); } 

Si está utilizando la altura del diseño para determinar la distancia, es posible que desee utilizar algo como un GlobalLayoutListener .

MDistanceToTriggerSync

En SwipeRefreshLayout , hay una variable interna llamada mDistanceToTriggerSync . Esto se utiliza para determinar a qué distancia para activar la actualización.

En el código fuente, se establece por el código de abajo en SwipeRefreshLayout :

 final DisplayMetrics metrics = getResources().getDisplayMetrics(); mDistanceToTriggerSync = (int) Math.min( ((View) getParent()) .getHeight() * MAX_SWIPE_DISTANCE_FACTOR, REFRESH_TRIGGER_DISTANCE * metrics.density); 

Lo anterior utiliza la altura de la vista principal y algunas constantes para calcular la distancia de disparo. MAX_SWIPE_DISTANCE_FACTOR (0.6) y REFRESH_TRIGGER_DISTANCE (120) son constantes privadas de la clase que no se pueden modificar.

Puede utilizar lo anterior para calcular su distancia de disparo y utilizar sus propias constantes para los factores de distancia de golpeo.

GlobalLayoutListener

El ajuste del mDistanceToTriggerSync se puede hacer dentro de un oyente de disposición global para que la altura del diseño se pueda recuperar correctamente para calcular la distancia del disparador. Llamar getHeight en una vista en onCreate siempre devolverá 0 porque todavía no se ha dibujado. Tengo el código de aquí . Usted puede o no necesitar hacer esto dependiendo de sus requisitos.

 ViewTreeObserver vto = swipeLayout.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // Calculate the trigger distance. final DisplayMetrics metrics = getResources().getDisplayMetrics(); Float mDistanceToTriggerSync = Math.min( ((View) swipeLayout.getParent()).getHeight() * 0.6f, 120 * metrics.density); try { // Set the internal trigger distance using reflection. Field field = SwipeRefreshLayout.class.getDeclaredField("mDistanceToTriggerSync"); field.setAccessible(true); field.setFloat(swipeLayout, mDistanceToTriggerSync); } catch (Exception e) { e.printStackTrace(); } // Only needs to be done once so remove listener. ViewTreeObserver obs = swipeLayout.getViewTreeObserver(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { obs.removeOnGlobalLayoutListener(this); } else { obs.removeGlobalOnLayoutListener(this); } } }); 

El ajuste de la variable sólo tiene que ser hecho una vez si entiendo el código subyacente correctamente, ya que sólo establece mDistanceToTriggerSync si es igual a -1 . Por lo tanto, debería ser seguro hacerlo en el oyente de disposición global una vez.

SwipeRefreshLayout

Si estás interesado en el código fuente de SwipeRefreshLayout puedes encontrarlo aquí .

La reversión 21 de la biblioteca de soporte v4 ha proporcionado una API para establecer la distancia.

 public void setDistanceToTriggerSync (int distance) 

Compruebe el documento aquí .

Una cosa más, la rev. 21 cambió el comportamiento de la barra de progreso, ahora es una imagen de círculo. No tengo idea de cómo recuperar el camino antiguo.

Actualmente no existe un método público, ni siquiera interno, que pueda ser usado para ajustar la distancia de disparo. Pero puedes copiar las tres clases de la biblioteca de soporte en tu proyecto, y luego modificar SwipeRefreshLayout a tu gusto.

Estas son las clases que necesitará copiar:

  • BakedBezierInterpolator
  • SwipeProgressBar
  • SwipeRefreshLayout

La distancia tigger se calcula usando las constantes:

  private static final float MAX_SWIPE_DISTANCE_FACTOR = .6f; private static final int REFRESH_TRIGGER_DISTANCE = 120; 

En su diseño cambie <android.support.v4.widget.SwipeRefreshLayout.../> a <your_path_to_SwipeRefreshLayout.../> y asegúrese de cambiar sus importaciones, si es necesario.

  • Cómo pasar la matriz int de identificadores de recursos de color desde array.xml a SwipeRefreshLayout.setColorSchemeResources
  • ¿Podemos establecer la distancia para activar el indicador de SwipeRefreshLayout?
  • AppBarLayout + TabLayout + CollapsingToolbarLayout + SwipeToRefresh
  • Scroll up no funciona con SwipeRefreshLayout en Listview
  • SwipeRefreshLayout con NestedScrollView y LinearLayout
  • ¿Cómo activar swiperefreshlayout en android?
  • ¿Cuál es la forma correcta de usar la barra de herramientas y SwipeRefreshLayout?
  • ¿Cómo deshabilitar la acción "pull to refresh" y usar sólo el indicador?
  • SwipeRefreshLayout en API 21
  • Problemas al integrar EnhancedListView y SwipeRefreshLayout
  • SwipeRefreshLayout interferir con setOnScrollListener
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.