studio recyclerview hacer como activity android android-support-library swiperefreshlayout

android - recyclerview - swiperefreshlayout kotlin



¿Cómo ajustar la distancia de deslizamiento hacia abajo en SwipeRefreshLayout? (3)

Actualmente no hay un método público, ni siquiera uno interno, que pueda usarse para ajustar la distancia de disparo. Pero puede copiar las tres clases de la biblioteca de soporte en su proyecto y luego modificar SwipeRefreshLayout a su gusto.

Aquí están las clases que necesitarás copiar:

La distancia del tigger se calcula utilizando 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.

Implementé SwipeRefreshLayout en mi aplicación. Necesito cambiar la altura que debe desplazarse 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 oncreate

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

Implementando un AsyncTask en el método onrefresh

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


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

public void setDistanceToTriggerSync (int distance)

Revisa el documento here .

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


Si está utilizando la API 21 de la biblioteca de soporte, consulte y por favor, vote por favor la respuesta de Han He here . Existe un método para establecer la distancia de activación llamada setDistanceToTriggerSync .

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

Sin embargo, si no desea conservar una copia de las clases para modificar las constantes, puede usar 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 usar algo como un GlobalLayoutListener .

mDistanceToTriggerSync

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

En el código fuente, se establece mediante el código siguiente 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 usa 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 en la clase que no puede modificar.

Puede usar lo anterior para calcular la distancia de disparo y usar sus propias constantes para los factores de distancia de barrido.

GlobalLayoutListener

La configuración de mDistanceToTriggerSync se puede hacer dentro de un oyente de diseño global para que la altura del diseño se pueda recuperar correctamente para calcular la distancia del disparador. Llamar a getHeight en una vista en onCreate siempre devolverá 0 porque aún no se ha dibujado. Tengo el código de here . 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); } } });

La configuración de la variable solo debe hacerse una vez si entiendo el código subyacente correctamente, ya que solo establece mDistanceToTriggerSync si es igual a -1 . Por lo tanto, debería ser seguro hacerlo en el escucha de diseño global una vez.

SwipeRefreshLayout

Si está interesado en el código fuente de SwipeRefreshLayout , puede encontrarlo here .