Eu tenho um layout muito simples, mas quando clico setRefreshing(true)
no onActivityCreated()
meu fragmento, ele não aparece inicialmente.
Ele só mostra quando eu faço um puxão para atualizar. Alguma idéia de por que não está aparecendo 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 do 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
thunderousNinja
fonte
fonte
Respostas:
Diante do mesmo problema. Minha solução -
fonte
Veja a resposta de Volodymyr Baydalka.
Essas são as soluções alternativas antigas.
Isso costumava funcionar na versão anterior do
android.support.v4
, mas a partir da versão 21.0.0 em andamento, ele não funciona e ainda existe com oandroid.support.v4:21.0.3
lançamento de 10 a 12 de dezembro de 2014, e esse é o motivo.O indicador SwipeRefreshLayout não aparece quando
setRefreshing(true)
é chamado antes doSwipeRefreshLayout.onMeasure()
Gambiarra:
chamando
setProgressViewOffset()
oSwipeRefreshLayout
que invalida a exibição do círculo do layout causandoSwipeRefreshLayout.onMeasure()
a chamada imediatamente.Melhor solução alternativa
Como a barra de ação pode ficar mais fina quando a orientação muda ou você definiu o tamanho da barra de ação manualmente. Definimos o deslocamento em pixels da parte superior desta visualização, na qual o controle giratório de progresso deve ser redefinido após um gesto de furto bem-sucedido para o tamanho atual da barra de ação.
ATUALIZAÇÃO 20 de novembro de 2014
Se não for muito crucial para o seu aplicativo exibir o SwipeRefreshLayout após o início da exibição. Você pode publicá-lo em um momento no futuro usando manipuladores ou qualquer coisa que desejar.
como um exemplo.
ou como a resposta de Volodymyr Baydalka mencionou.
Aqui está o problema no rastreador de problemas do Android. Faça um voto positivo para mostrar a eles que precisamos que seja corrigido.
fonte
delay time
? Eu estou usando500
no meuGalaxy S4
. Não tenho certeza se isso seria um problema em outro dispositivo.500
faria fine.I testei noemulator
.Eu só queria estarsafe
com os1000
milissegundosMinha solução é substituir
SwipeRefreshLayout
:fonte
fonte
setRefreshing(false)
encerradasonGlobalLayoutListener()
não descartam o indicador de carregamento.Com a biblioteca de suporte Android 24.2.0, o problema deveria ter sido resolvido! https://developer.android.com/topic/libraries/support-library/revisions.html#24-2-0-bugfixes
fonte
Com base na resposta de Volodymyr Baydalka , essa é apenas uma pequena idéia que o ajudará a manter o código limpo. Ele merece um post, acredito: você poderá reverter o comportamento facilmente da postagem para a chamada direta ao método, assim que o bug for corrigido.
Escreva uma classe de utilitário como:
No seu código, substitua
mSwipeContainer.setRefreshing(isRefreshing)
porUtils.setRefreshing(mSwipeContainer, isRefreshing)
: agora apenas um ponto no código precisa ser alterado após a correção do bug, aUtils
classe. O método também pode ser incorporado em seguida (e removidoUtils
).Geralmente não haverá diferença visual perceptível. Lembre-se de que a atualização pendente pode manter vivas suas
Activity
instâncias antigas , mantendo asSwipeRefreshLayout
hierarquias de exibição. Se isso for uma preocupação, ajuste o método para usarWeakReference
s, mas normalmente você não bloqueia o encadeamento da interface do usuário e, portanto, atrasa o gc em apenas alguns milissegundos.fonte
Além disso, você pode chamar esse método antes de setRefreshing ..
Funcionou para mim.
fonte
Eu usei a AppCompat Library
com.android.support:appcompat-v7:21.0.3
, usando sua mesma abordagem e funcionou. Então, você atualiza a versão dessa biblioteca.Conselho:
RelativeLayout
não suporta orientação, é um atributo paraLinearLayout
.XML de layout:
fonte
Além de Volodymyr Baydalka, use também o seguinte código:
Explicação Eu implementei a solução fornecida por Volodymyr Baydalka (usando fragmentos), mas após o furtoReferesh iniciado, ele nunca desapareceu nem mesmo ao chamar
swipeContainer.setRefreshing(false);
então tivemos que implementar o código fornecido acima, que resolveu meu problema. mais idéias sobre por que isso acontece são bem-vindas.Saudações,
'com.android.support:appcompat-v7:22.2.1'
fonte
@ niks.stack Em resposta à sua resposta, eu mostraria a roda do progresso depois de
onLayout()
ter sido feito. Quando eu o usei diretamente depoisonMeasure()
, ele não honraria algumas das compensações, mas usá-lo depoisonLayout()
fez.fonte
Minha solução (sem suporte v7) -
fonte
Estou usando 'com.android.support:appcompat-v7:23.1.1'
anteriormente eu estava usando o método
swipeRefreshLayout.setRefreshing(true);
internogetData()
, então não estava funcionando. Não sei por que não está funcionando dentro do método.Embora eu usei
swipeRefreshLayout.setRefreshing(true);
apenas uma vez no meu fragmento.fonte
Tente isto
mSwipeRefreshLayout.setNestedScrollingEnabled (true);
fonte
Outra solução alternativa é criar um novo controle e derivador do SwipeRefreshLayout. Substitua a função OnMeasure e alterne a atualização novamente, se a atualização estiver ativada. Eu uso essa solução em um projeto xamarin e funciona bem. Aqui estão alguns exemplos de código C #:
fonte