【问题标题】:Xamarin - Refresh listview after PostXamarin - 发布后刷新列表视图
【发布时间】:2017-08-10 20:27:09
【问题描述】:

我正在开发一个 Xamarin Forms 应用程序,它有一个标签页。其中一个选项卡包含一个 ListView 控件,显示从 Rest API 消耗的数据。如果我点击添加按钮,一个模式会显示我可以在哪里创建新项目并将帖子发送到 Rest API。成功后,我从导航中弹出模式,留下ListView 显示。在我的ListView 中,最后添加的项目没有显示。

如何在添加项目后刷新调用 Rest API 的ListView

这是我的 XAML 页面:BonosView.xaml

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns ="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:iconize="clr-namespace:FormsPlugin.Iconize;assembly=FormsPlugin.Iconize"
    x:Class="rodriguez.BonosView" x:Name="BonosView"
    Title="Bonos">

    <ContentPage.Padding>
        <OnPlatform x:TypeArguments="Thickness" iOS="0, 20, 0, 0" />
    </ContentPage.Padding>

    <ContentPage.Content>
        <StackLayout>
            <Label x:Name="BonosListMessage" IsVisible="false" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" Text="No exixten bonos para mostrar"/>
            <ListView x:Name="BonosList" ItemTapped="ViewDetails" RowHeight="70" >
                <ListView.ItemTemplate>
                  <DataTemplate>
                        <ViewCell>
                            <Grid>
                                <Grid.Padding>
                                    <OnPlatform x:TypeArguments="Thickness" iOS="10,5" Android="10,5"/>
                                </Grid.Padding>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="*"/>
                                    <RowDefinition Height="*"/>
                                    <RowDefinition Height="*"/>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>

                                <Label x:Name="monto" Text="{Binding Monto}" Style="{DynamicResource TitleListBono}" Grid.Row="0" Grid.ColumnSpan="2" LineBreakMode="NoWrap" HorizontalOptions="StartAndExpand"/>
                                <Label x:Name="nombre" Text="{Binding nombreCompleto}" FontSize="Small" FontAttributes="Bold" Grid.Row="1" Grid.Column="0" HorizontalOptions="StartAndExpand"/>
                                <Label x:Name="estado" Text="{Binding Estado}" FontSize="Small" Grid.Row="1" Grid.Column="1" HorizontalOptions="End" TextColor="Green"/>
                                <Label x:Name="montoRD" Text="{Binding MontoRD}" FontSize="Small" Grid.Row="2" Grid.Column="0" HorizontalOptions="StartAndExpand"/>
                                <Label x:Name="fecha" Text="{Binding fechaCompra, StringFormat='{0:dd-MMM-yyyy}'}" FontSize="Small" Grid.Row="2" Grid.Column="1" HorizontalOptions="End"/>
                            </Grid>
                        </ViewCell>
                  </DataTemplate>
                </ListView.ItemTemplate>
              </ListView>

        </StackLayout>
    </ContentPage.Content>
</ContentPage>

这是我用来填充列表的方法:

async void refreshData()
{
    this.IsBusy = true;
    bonosLista = await manager.GetAll();  //obtaining bonos from Server

    if (bonosLista != null)
    {
        if (bonosLista.Count() > 0)
        {
            BonosList.ItemsSource = bonosLista;
        }
        else
        {
            BonosList.IsVisible = false;
            BonosListMessage.IsVisible = true;
        }
    }
    else
    {
        await DisplayAlert("Error!", "Se ha producido un error en la conexión", "OK");
    }

    this.IsBusy = false;
}

我想在模式弹出后调用该方法。

【问题讨论】:

  • 我会在 Post 完成后使用 MessagingCenter 发送一条消息,然后告诉 LIstView 刷新它的数据
  • 如果您将模型中的 BonosList.ItemsSource 绑定定义为 ObservableCollection,则 bonosLista 列表应该更新
  • 如果我推送到列表@YuriS 就会这样做
  • “推”是什么意思?这行应该这样做: BonosList.ItemsSource = bonosLista;
  • push = 将对象添加到列表中

标签: c# rest listview xamarin xamarin.forms


【解决方案1】:

使用Appearing 事件是正确的,但您也不需要在方法上使用async void,除非它是事件处理程序

更新refreshData 方法以使用async Task

async Task refreshData() {
    this.IsBusy = true;
    bonosLista = await manager.GetAll();  //obtaining bonos from Server

    if (bonosLista != null) {
        if (bonosLista.Count() > 0) {
            BonosList.ItemsSource = bonosLista;
        } else {
            BonosList.IsVisible = false;
            BonosListMessage.IsVisible = true;
        }
    } else {
        await DisplayAlert("Error!", "Se ha producido un error en la conexión", "OK");
    }
    this.IsBusy = false;
}

事件处理程序是唯一可以使用 async void 的地方,因此请更新到

this.Appearing += async (object sender, EventArgs e) => {
    await refreshData();
};

【讨论】:

    【解决方案2】:

    我最终在包含列表视图的页面上使用了Appearing 方法,因此当模式弹出时,我可以在该方法中刷新。也许不是最好的解决方案,购买它现在正在工作。

    this.Appearing += (object sender, EventArgs e) =>
    {
                refreshData();
    };
    

    【讨论】:

      【解决方案3】:

      我建议使用内置的MessagingCenter 来代替,这样您就不必刷新整个列表。在 Add 按钮的命令中,使用 MessagingCenter 发送新的“bonos”项目,并在已经呈现列表的页面/视图模型中订阅该消息以将其添加到已经存在的项目集合中。

      【讨论】:

        猜你喜欢
        • 2013-07-18
        • 1970-01-01
        • 1970-01-01
        • 2018-03-14
        • 1970-01-01
        • 1970-01-01
        • 2020-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多