Tengo un diseño muy simple, pero cuando llamo setRefreshing(true)
a onActivityCreated()
mi fragmento, no se muestra inicialmente.
Solo se muestra cuando hago una extracción para actualizar. ¿Alguna idea de por qué no aparece inicialmente?
Fragmento xml:
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_container"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</RelativeLayout>
</ScrollView>
</android.support.v4.widget.SwipeRefreshLayout>
Código de fragmento:
public static class LinkDetailsFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener {
@InjectView(R.id.swipe_container)
SwipeRefreshLayout mSwipeContainer;
public static LinkDetailsFragment newInstance(String subreddit, String linkId) {
Bundle args = new Bundle();
args.putString(EXTRA_SUBREDDIT, subreddit);
args.putString(EXTRA_LINK_ID, linkId);
LinkDetailsFragment fragment = new LinkDetailsFragment();
fragment.setArguments(args);
return fragment;
}
public LinkDetailsFragment() {
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mSwipeContainer.setOnRefreshListener(this);
mSwipeContainer.setColorScheme(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
mSwipeContainer.setRefreshing(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.fragment_link_details, container, false);
ButterKnife.inject(this, rootView);
return rootView;
}
@Override
public void onRefresh() {
// refresh
}
}
android
swiperefreshlayout
Ninja atronador
fuente
fuente
Respuestas:
Ante el mismo problema. Mi solución -
fuente
Ver la respuesta de Volodymyr Baydalka en su lugar.
Estas son las viejas soluciones alternativas.
Eso solía funcionar en una versión anterior de la
android.support.v4
, pero desde la versión 21.0.0 en curso no funciona y todavía existe con elandroid.support.v4:21.0.3
lanzamiento del 10 al 12 de diciembre de 2014 y esta es la razón.El indicador SwipeRefreshLayout no aparece cuando
setRefreshing(true)
se llama antes deSwipeRefreshLayout.onMeasure()
Solución alterna:
llamando
setProgressViewOffset()
alSwipeRefreshLayout
que invalida la vista circular del diseño haciendoSwipeRefreshLayout.onMeasure()
que se llame inmediatamente.ACTUALIZAR Mejor solución
Debido a que la barra de acción podría adelgazarse cuando cambia la orientación o si ha establecido el tamaño de la barra de acción manualmente. Establecemos el desplazamiento en píxeles desde la parte superior de esta vista en la que la flecha de progreso debe reiniciarse después de un gesto de deslizamiento exitoso al tamaño actual de la barra de acción.
ACTUALIZACIÓN Nov 20 2014
Si no es muy importante para su aplicación mostrar SwipeRefreshLayout una vez que se inicia la vista. Puede publicarlo en un momento en el futuro mediante el uso de controladores o cualquier cosa que desee.
como ejemplo.
o como mencionó la respuesta de Volodymyr Baydalka.
Aquí está el problema en el rastreador de problemas de Android. Vota a favor para mostrarles que necesitamos que se solucione.
fuente
delay time
? Estoy usando500
en miGalaxy S4
. No estoy seguro de si esto sería un problema en otro dispositivo.500
estaría bien. Lo he probado enemulator
. Solo quería estarsafe
con los1000
milisegundosMi solución es anular
SwipeRefreshLayout
:fuente
fuente
setRefreshing(false)
incluidasonGlobalLayoutListener()
no descartan el indicador de carga.Con la biblioteca de soporte de Android 24.2.0, ¡el problema debería haberse resuelto! https://developer.android.com/topic/libraries/support-library/revisions.html#24-2-0-bugfixes
fuente
Según la respuesta de Volodymyr Baydalka , esta es solo una pequeña idea que lo ayudará a mantener limpio el código. Merece una publicación, creo: podrá revertir fácilmente el comportamiento de la publicación a la llamada al método directo, una vez que se solucione el error.
Escribe una clase de utilidad como:
En su código, sustitúyalo
mSwipeContainer.setRefreshing(isRefreshing)
porUtils.setRefreshing(mSwipeContainer, isRefreshing)
: ahora solo se necesita cambiar un punto en el código una vez que se corrige el error, laUtils
clase. El método también se puede insertar en línea (y eliminarUtils
).Por lo general, no habrá una diferencia visual notable. Sin embargo, tenga en cuenta que la actualización pendiente podría mantener vivas sus
Activity
instancias anteriores, manteniendo lasSwipeRefreshLayout
jerarquías en su vista. Si eso es una preocupación, modifique el método para usarWeakReference
s, pero normalmente no bloquea el hilo de la interfaz de usuario de todos modos, y por lo tanto demora gc solo por un par de milisegundos.fuente
También puede llamar a este método antes de setRefreshing.
Me funcionó.
fuente
Utilicé AppCompat Library
com.android.support:appcompat-v7:21.0.3
, usando tu mismo enfoque y funcionó. Entonces, actualizas la versión de esa biblioteca.Consejo:
RelativeLayout
no admite orientación, es un atributo paraLinearLayout
.Diseño XML:
fuente
Además de Volodymyr Baydalka, use también el siguiente código:
Explicación Implementé la solución dada por Volodymyr Baydalka (usando fragmentos) pero después de que se inició swipeReferesh nunca desapareció, incluso al llamar,
swipeContainer.setRefreshing(false);
así que tuve que implementar el código dado anteriormente que resolvió mi problema. cualquier otra idea de por qué sucede esto es bienvenida.Saludos,
'com.android.support:appcompat-v7:22.2.1'
fuente
@ niks.stack En respuesta a su respuesta, mostraría la rueda de progreso después de que
onLayout()
se haya hecho. Cuando lo usé directamente despuésonMeasure()
, no honraría algunas de las compensaciones, pero usarlo después loonLayout()
hizo.fuente
Mi solución (sin soporte v7) -
fuente
Estoy usando 'com.android.support:appcompat-v7:23.1.1'
anteriormente estaba usando el método
swipeRefreshLayout.setRefreshing(true);
insidegetData()
, por lo que no estaba funcionando. No sé por qué no funciona dentro del método.Aunque
swipeRefreshLayout.setRefreshing(true);
solo lo usé una vez en mi Fragmento.fuente
Prueba esto
mSwipeRefreshLayout.setNestedScrollingEnabled (verdadero);
fuente
Otra solución es crear un nuevo control y derivador de SwipeRefreshLayout. Anule la función OnMeasure y vuelva a alternar la actualización, si la actualización está activada. Utilizo esta solución en un proyecto xamarin y funciona bien. Aquí algunos ejemplos de código C #:
fuente