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
- ¿Cómo configurar la vista de actualización personalizada en SwipeRefreshLayout?
- RecyclerView y SwipeRefreshLayout
- SwipeRefreshLayout Got Action_Move congela la vista
- La nueva versión de SwipeRefreshLayout causa un dibujo erróneo de vistas
- Hacer una costumbre SwipeRefreshLayout Indicator?
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 }
- Barra de herramientas que no se muestra con desplazamiento para actualizar
- Cómo detener ScrollView desde el desplazamiento hasta la parte inferior de la página cargada actual en WebView
- SwipeRefreshLayout: Desplazar la animación de progreso
- SwipeRefreshLayout - Tirar desde el fondo
- Cómo utilizar PullToRefresh en StaggeredGridView?
- SwipeRefreshLayout dentro de ViewPager
- SyncAdapter siempre en estado pendiente
- RecycleView se bloquea en Fragmento porque LayoutManager es NULL
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.
- ¿Cuál es la diferencia entre EventBus y RxJava?
- Puedo obtener el ancho de archivo de imagen y la altura de uri en android?