如何定期在xamarin表单中刷新ContentPage中的ListView

时间:2017-04-21 16:44:00

标签: xamarin xamarin.forms content-pages

我在内容页面中有一个列表视图,列表视图项目是从SQLite中选取的。我想定期刷新页面,以便能够显示在sql lite中插入的最新项目。 1.当我第一次添加该记录的记录状态在本地数据库中“排队”时,将显示列表项,该项的状态将显示为“[EmployeeNo]它排队5分钟后它将被同步” 。 2.5分钟后,所有本地db [Sqlite]将与实际的sql server同步,然后该记录的状态将在本地db中更新为“completed”,然后状态我想显示“[EmployeeNo]它已完成“在列表视图中自动显示。

3 个答案:

答案 0 :(得分:3)

使用ObservableCollection<T>作为您的ItemSource - 无论何时添加或删除项目,它都会自动更新用户界面

答案 1 :(得分:0)

StartTimer

        Device.StartTimer (new TimeSpan (0, 0, 10), () => {
            // do something every 10 seconds

            return true; // runs again, or false to stop
        });

答案 2 :(得分:0)

公共类EmployeeListPage:ContentPage     {

    ListView listView;

    public EmployeeListPage()
    {
        Title = "Todo";
        StartTimer();
        var toolbarItem = new ToolbarItem
        {
            Text = "+",
            Icon = Device.OnPlatform(null, "plus.png", "plus.png")
        };
        toolbarItem.Clicked += async (sender, e) =>
        {
            await Navigation.PushAsync(new EmployeeItemPage
            {
                BindingContext = new Employee()
            });
        };
        ToolbarItems.Add(toolbarItem);

        listView = new ListView
        {
            Margin = new Thickness(20),
            ItemTemplate = new DataTemplate(() =>
            {
                var label = new Label
                {
                    VerticalTextAlignment = TextAlignment.Center,
                    HorizontalOptions = LayoutOptions.StartAndExpand
                };
                label.SetBinding(Label.TextProperty, "EmployeeName");

                var labelText = new Label
                {
                    VerticalTextAlignment = TextAlignment.Center,
                    HorizontalOptions = LayoutOptions.StartAndExpand
                };
                label.SetBinding(Label.TextProperty, "EmpStatusDisplayText");

                var tick = new Image
                {
                    Source = ImageSource.FromFile("check.png"),
                    HorizontalOptions = LayoutOptions.End
                };
                tick.SetBinding(VisualElement.IsVisibleProperty, "IsActive");

                var stackLayout = new StackLayout
                {
                    Margin = new Thickness(20, 0, 0, 0),
                    Orientation = StackOrientation.Horizontal,
                    HorizontalOptions = LayoutOptions.FillAndExpand,
                    Children = { label, tick }
                };

                return new ViewCell { View = stackLayout };
            })
        };
        listView.ItemSelected += async (sender, e) =>
        {
            EmployeeDatabindingDto dto = (e.SelectedItem as EmployeeDatabindingDto);
            Employee emp = new Employee {EmployeeID=dto.EmployeeID,EmployeeName=dto.EmployeeName,Salary=dto.Salary,IsActive=dto.IsActive };
            Debug.WriteLine("Employee ResumeAt Id = " + emp.EmployeeID);

            await Navigation.PushAsync(new EmployeeItemPage
            {
                BindingContext = emp
            });
        };

        Content = listView;
    }

    protected override async void OnAppearing()
    {
        base.OnAppearing();
        List<Employee> employees = await App.EmpDatabase.GetItemsAsync();
        List<EmployeeDatabindingDto> listBindingDto = await MapEmpWithEmpBindingDto(employees);
        listView.ItemsSource = listBindingDto;
    }

    public async Task<List<EmployeeDatabindingDto>> MapEmpWithEmpBindingDto(List<Employee> employees)
    {
        List<EmployeeDatabindingDto> bindEmployees = new List<EmployeeDatabindingDto>();

        foreach (var employee in employees)
        {
            string displaysText = "";
            string displayDate = "";

            displayDate = employee.IsActive == false ? employee.Createddate.ToString() : employee.Modifieddate.ToString();
            displaysText = employee.IsActive == false ? string.Format("{0} {1}", "is in queued on", displayDate) : string.Format("{0} {1} ", "is submitted on", displayDate);
            bindEmployees.Add(new EmployeeDatabindingDto
            {
                EmployeeID = employee.EmployeeID
                ,
                EmployeeName = employee.EmployeeName
                ,
                Salary = employee.Salary
                ,
                Createddate = employee.Createddate
                ,
                IsActive = employee.IsActive
                ,
                EmpStatusDisplayText = string.Format("{0} {1}", employee.EmployeeName, displaysText)
            });
        }
        return bindEmployees;
    }

    private void StartTimer()
    {
        Device.StartTimer(System.TimeSpan.FromSeconds(10), () =>
        {
            List<Employee> employees = App.EmpDatabase.GetItemsAsync().Result;
            List<EmployeeDatabindingDto> listBindingDto = MapEmpWithEmpBindingDto(employees).Result;
            listView.ItemsSource = listBindingDto;
            Device.BeginInvokeOnMainThread(UpdateUserDataAsync);
            return true;
        });
    }

    private async void UpdateUserDataAsync()
    {
        await App.EmpDatabase.UpdateEmpStatusAsync();
    }
}