SwipeRefreshLayout com NestedScrollView – Android

Tempo de leitura: < 1 minute

Introdução:

No Android, temos SwipeRefreshLayout, que costumamos usar em nossos layouts para atualizar o conteúdo de uma visualização com o recurso de gesto vertical, sempre que precisamos. O SwipeRefreshLayout pode suportar apenas um filho direto, então sempre que precisarmos adicionar em nosso layout, sempre tentamos adicionar antes de nosso RecyclerView como este trecho de código abaixo:

<LinearLayout 
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:orientation="vertical">
     
     <andridx.Swiperfreshlayout.widget.Swiperfreshlayout
         android:id="@+id/SwipeRefresh"
         android:layout_width="match_parent"
         android;layout_height="wrap_content">
         
   	 <andridx.recyclerview.widget.RecyclerView
             android:id="@+id/recycler"
             android:layout_width="match_parent"
             android:layout_height="match_parent"/>
             
     </andridx.Swiperfreshlayout.widget.Swiperfreshlayout>
</LinearLayout>

Recentemente, tenho trabalhado em um aplicativo onde tenho um RecyclerView com CoolapingToolbar e NestedScrollView, e preciso adicionar um SwipeRefreshLayout, então apenas implementei a forma como ele parecia acima simplesmente coloque o SwipRefreshLayout acima do RecyclerView.

Depois disso, eu apenas executei o aplicativo e adivinhe, nada aconteceu e os dados não estavam aparecendo na lista, então eu descobri o que está errado na implementação.

 

Como resolver:

A solução é muito simples, precisamos adicionar um SwipRefreshLayout acima de NestedScrollView e, portanto, você deve mover o app:layout_behavior="@string/appbar_scrolling_view_behavior" de NestedScrollView para SwipeRefreshLayout.

Isso é apenas executa seu aplicativo e vê os resultados.

Vamos ver com o arquivo XML.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match parent"
    android:layout_heigth:"match_parent"
    android:background="@color/activity_background"
    android:orientation="vertical">
    
    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
        android:id="@+id/swipe refresh"
        android:layout_width="match_parent"
        android:layout_heigth="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
        
    <androidx.core.widget.NestedScrollView
        android:layout_width="match parent"
        android:layout_heigth="match parent"
        android:fillViewport="true"
        android:scrollbars="none">
        
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_heigth="wrap_content"
            android:facusableInTouchMove="true"
            android:orientation="vertical">
            
            <androidx.recyclerview.widget.RecyclerView
                 android:id="@+id/recycler"
                 android:layout_width="match_parent"
                 android:layout_heigth="wrap_content"
                 android:descendantFocusability="blocksDescendants"
                 android:filsSystemWindows="true"
                 android:focusableInTouchMode="true" />
                 
        </LinearLayout>
    </androidx.core.widget.NestedScrollView>
</LinearLayout>

Conclusão:

Este artigo descreveu como implementar o SwipeRefreshLayoyut com NestedScrollView, como a implementação é diferente da tradicional.