индикатор xamarin не отображается - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь показать индикатор, когда читаю данные из моего веб-сервиса, После поиска в Интернете и сопоставляю с моим кодом, в качестве приведенного ниже кода имею возвращение ListView и показ индикатора, но индикатор не отображается. На главной странице, которую я нажимаюна кнопку «Показать новости» и перейти к новой форме в новой форме. У меня есть следующий код после начальной формы:

private async void GetProduct()
{
    var indicator = new ActivityIndicator
    {
        HorizontalOptions = LayoutOptions.CenterAndExpand,
        Color = Color.Black,
        IsVisible = true
    };
    HttpClient httpClient = new HttpClient();
    var response = await httpClient.GetStringAsync("http://mySrvice.domain.com/api/news/getlastten");

    indicator.IsRunning = true;
    indicator.IsVisible = true;
    var TProducts = JsonConvert.DeserializeObject<List<News>>(response);
    Label header = new Label
    {
        Text = "Last ten news",
        FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)),
        HorizontalOptions = LayoutOptions.Center
    };

    ListView listView = new ListView
    {
        ItemsSource = TProducts,
        ItemTemplate = new DataTemplate(() =>
        {
            // Create views with bindings for displaying each property.
            Label nameLabel = new Label();
            nameLabel.SetBinding(Label.TextProperty, "Title");
            nameLabel.SetBinding(Label.FontFamilyProperty, "BNazanin.ttf#Nazanin");
            nameLabel.SetBinding(Label.HorizontalTextAlignmentProperty, "Start");



            Image nImage = new Image();
            nImage.SetBinding(Image.SourceProperty, "ImageURL");

            Label ViewdLabel = new Label();
            ViewdLabel.SetBinding(Label.TextProperty, "Viewed");

            nameLabel.SetBinding(Label.FontFamilyProperty, "BNazanin.ttf#Nazanin");

            // Return an assembled ViewCell.
            return new ViewCell
            {
                View = new StackLayout
                {
                    Padding = new Thickness(0, 5),
                    Orientation = StackOrientation.Horizontal,
                    FlowDirection = FlowDirection.RightToLeft,
                    Children =
                        {
                            nImage,
                            new StackLayout
                            {
                                VerticalOptions = LayoutOptions.Center,

                                Spacing = 0,
                                Children =
                                {

                                    nameLabel,
                                    ViewdLabel
                                }
                                }
                        }
                }
            };
        })
    };

    listView.ItemSelected += async (sender, e) =>
    {
        News = (News)e.SelectedItem;

        await Navigation.PushAsync(new NewsDetails(News));
    };
    this.Content = new StackLayout
    {
        Children =
        {
            indicator,
            header,
            listView
        }
    };
    indicator.IsRunning = false;
    indicator.IsVisible = false;
}

1 Ответ

0 голосов
/ 19 февраля 2019

Как отметил другой пользователь в комментариях, ActivityIndicator не появится, если вы не добавите его на страницу.Вы добавляете его на страницу в конце GetProduct() и сразу делаете его невидимым, следовательно, он никогда не виден, либо потому, что он еще не был добавлен, либо потому, что он стал невидимым.

Есть несколько возможностей, которых вы можете достичь, чего хотите.Самым простым может быть добавление ActivityIndicator в начале GetProducts()

var indicator = new ActivityIndicator
{
    HorizontalOptions = LayoutOptions.CenterAndExpand,
    Color = Color.Black,
    IsVisible = true,
    IsRunning = true
};
this.Content = indicator; 

HttpClient httpClient = new HttpClient();
var response = await httpClient.GetStringAsync("http://mySrvice.domain.com/api/news/getlastten");

(IsRunning устанавливается немедленно, поскольку я предполагаю, что вы хотите, чтобы индикатор работал пока вы получаете продукты с сервера, а не после.)

Вам не понадобится индикатор в окончательном макете стека, поэтому вы можете установить Content с помощью

this.Content = new StackLayout
{
    Children =
    {
        header,
        listView
    }
};

Примечание: : использование XAML и MVVM может быть очень полезным для этих вещей.

...