How to refresh ListView in ContentPage in xamarin forms periodically

最后都变了- 提交于 2019-12-13 07:48:16

问题


I have a List-View in the content page, List view Items are picked from the SQLite. I want to refresh the page periodically so that I can able to show the latest items inserted in the sql lite. 1. When the first time I added record status of that record is "queued"in local db, List Item will be displayed and status of that Item will be shown as "[EmployeeNo] it is queued After 5 minutes it will be synced". 2.After 5 minutes,All local db [Sqlite] will be synced with the actual sql server, Then status of that record will be updated to "completed" in local db,Then status I want to show "[EmployeeNo] it is completed" in list view automatically.


回答1:


Use an ObservableCollection<T> as your ItemSource - it will automatically update the UI whenever items are added or removed from it




回答2:


StartTimer

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

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



回答3:


public class 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();
    }
}


来源:https://stackoverflow.com/questions/43548006/how-to-refresh-listview-in-contentpage-in-xamarin-forms-periodically

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!