RefreshView

Sabe quando você puxa a tela do celular para atualizar o conteúdo? Agora ficou fácil fácil de fazer com Xamarin.Forms! Neste post vamos ver melhor como implementar PullToRefresh com o RefreshView.

O RefreshView

O RefreshView é um novo controle de tela adicionado ao Xamarin.Forms na versão 4.3. Ele permite que você adicione o comportamento de PullToRefresh (puxe para atualizar) em qualquer componente de tela que seja scrollavel, como ListView, CollectionView, ScollView.

Ele dispõe de propriedades bastante interessantes para sua personalização, como:

  • RefreshColor – Propriedade para personalizar a cor do indicador de atividade
  • IsRefreshing – Propriedade booleana para controlar a exibição do indicador de atividade e executar o command diretamente da ViewModel
  • CommandParameter – Propriedade para enviar valores para o command a ser executado.

Implementando

O primeiro passo para utilizar o RefreshView é verificar se você está na versão 4.3 do Xamarin.Forms ou superior. Se não estiver, atualize o Xamarin.Forms antes de continuar.

Com um projeto em branco, vamos adicionar uma classe chamada MainPageViewModel. Nela vamos adicionar uma lista que será a fonte de dados para nossa tela:

Neste projeto estou utilizando o pacote MVVMHelpers do James Montemagno para auxiliar no trabalho com as View Models.

public class MainPageViewModel : BaseViewModel
{
    public ObservableRangeCollection<string> Times { get; set; }

    public MainPageViewModel()
    {
        Times = new ObservableRangeCollection<string>
        {
            "Corinthians",
            "São Paulo",
            "Palmeiras",
            "Santos",
            "Internacional",
            "Grêmio",
            "Flamengo",
            "Botafogo",
            "Vasco",
            "Cruzeiro",
            "Atlético-MG",
            "Bahia",
            "Atlético-PR"
        };
    }
}

Agora, na tela vamos adicionar um Bindable StackLayout com a fonte de dados que criamos acima. É importante que ele esteja entre um ScrollView:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:PullRefresh"
             x:Class="PullRefresh.MainPage">

    <StackLayout Margin="10">
        <ScrollView>
            <StackLayout BindableLayout.ItemsSource="{Binding Times}">
                <BindableLayout.ItemTemplate>
                    <DataTemplate>
                        <StackLayout Margin="10">
                            <Label Text="{Binding .}"
                                   FontSize="Large"
                                   FontAttributes="Bold"/>
                        </StackLayout>
                    </DataTemplate>
                </BindableLayout.ItemTemplate>
            </StackLayout>
        </ScrollView>
    </StackLayout>
</ContentPage>

O próximo passo é adicionar o RefreshView. Vamos adiciona-lo como pai do nosso BindableLayout:

<RefreshView>
    <ScrollView>
        <StackLayout BindableLayout.ItemsSource="{Binding Times}">
            <BindableLayout.ItemTemplate>
                <DataTemplate>
                    <StackLayout Margin="10">
                        <Label Text="{Binding .}"
                            FontSize="Large"
                            FontAttributes="Bold"/>
                    </StackLayout>
                </DataTemplate>
            </BindableLayout.ItemTemplate>
        </StackLayout>
    </ScrollView>
</RefreshView>

Na MainPageViewModel, vamos adicionar o command que o RefreshView irá acionar quando a tela for scrollada para cima. O command irá transformar a lista de times em uma lista de Pokémons apenas com o pokémon Pikachu:

public class MainPageViewModel : BaseViewModel
{
    public ObservableRangeCollection<string> Times { get; set; }

    public ICommand AtualizarListaCommand { get; set; }

    public MainPageViewModel()
    {
        AtualizarListaCommand = new Command(() =>
        {
            Times.Clear();
            Times.Add("Pikachu");
        });

        Times = new ObservableRangeCollection<string>
        {
            "Corinthians",
            "São Paulo",
            "Palmeiras",
            "Santos",
            "Internacional",
            "Grêmio",
            "Flamengo",
            "Botafogo",
            "Vasco",
            "Cruzeiro",
            "Atlético-MG",
            "Bahia",
            "Atlético-PR"
        };
    }
}

Agora basta adicionar a chamada do command no RefreshView:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:PullRefresh"
             x:Class="PullRefresh.MainPage">

    <StackLayout Margin="10">
        <RefreshView  Command="{Binding AtualizarListaCommand}"
                    RefreshColor="Purple">
            <ScrollView>
                <StackLayout BindableLayout.ItemsSource="{Binding Times}">
                    <BindableLayout.ItemTemplate>
                        <DataTemplate>
                            <StackLayout Margin="10">
                                <Label Text="{Binding .}"
                                    FontSize="Large"
                                    FontAttributes="Bold"/>
                            </StackLayout>
                        </DataTemplate>
                    </BindableLayout.ItemTemplate>
                </StackLayout>
            </ScrollView>
        </RefreshView>
    </StackLayout>
</ContentPage>

Conclusão

E então? Bastante fácil não é? Desta maneira o desenvolvimento com Xamarin.Forms fica mais flexível e mais personalizável, sendo mais fácil de adapta-lo as nossas necessidades. Acompanhe as novas versões do Xamarin.Forms, vem muita coisa boa por aí!

#Ubuntu

Cross post de http://rsamorim.azurewebsites.net/2019/12/20/refreshview-deixando-tudo-atualizavel/

Robson Soares Amorim