xamarin.forms使用选择器更新Listview

时间:2019-06-22 18:41:54

标签: xamarin xamarin.forms

我有一个xamarin表单应用程序,顶部有一个选择器,下面有一个列表视图。当应用程序启动时,选择器上的数据将通过Web API绑定,然后根据选择器的值进行另一个API调用并且列表视图将加载。当用户更改picker的值时,应该更新Listview。我没有使用任何viewmodel。我有一个用于API调用的帮助器类,并且将json结果设置为列表并将其设置为listview的itemsource。我以某种方式实现了它,但是它不平滑,并且当我更改picker.NB的值时有时会出错,并显示为“内存不足异常”。NB:我在Rg.popup.Plugin中使用了自定义选择器。会将所选值设置为标签。

我的问题是

  1. 这是加载列表视图的正确方法吗,该列表视图将在更改选择器的值时更新?我该怎么做?
  2. 我是否应该为此场景使用viewmodel(MVVM)模式?我的列表将包含更大的数据。

我的xamal.cs 注意: APICall 类将以正确的格式返回json。

  public partial class List : ContentPage
    {
        string weekstart;
        string WeekString;
        ObservableCollection<PickerData> resultObjcallForPicker = new ObservableCollection<PickerData>();       
        public TimeSheetList()
        {
            InitializeComponent();
            Thread loadScreenItemsThread = new Thread(new ThreadStart(LoadScreenItemsAsync));
            loadScreenItemsThread.Start();               
        }
         public async void LoadScreenItemsAsync()
         {                             
          //Picker Data loading       
            string postdataForPicker = "{\"Username\":\"" + Settings.userID + "\",\"ConnectionString\":\"" + Settings.String+ "\"}";
            APICall callForPicker = new APICall("/API/ListMobile/PickerData", postdataForPicker, loadingIndicator);
            try
            {
                    resultObjcallForPicker = callForPicker.APICallResult<ObservableCollection<PickerData>>();
                if (resultObjcallForPicker != null)
                {
                    WeekString = DateTime.Parse(resultObjcallForPicker[0].SDate).ToString("dd-MMM-yyyy");
                    Device.BeginInvokeOnMainThread(async () =>
                    {
                        // Setting the value of picker initially.
                    WeekStart.Text = WeekString;                                        
                    });
                    await loadList();                   
                }
                else
                {
                    Device.BeginInvokeOnMainThread(async () =>
                    {
                        UserDialogs.Instance.HideLoading();
                        await DisplayAlert("", "error occured", "OK");
                    });
                }
            }
            catch (Exception)
            {
                Device.BeginInvokeOnMainThread(async () =>
                {
                    UserDialogs.Instance.HideLoading();
                    ErrorMessageData errorMessage = new ErrorMessageData();
                    errorMessage.Flag = false; errorMessage.Message = callForPicker.errorMessage.Message;
                });
            }

        }

        //<<----------------Loading Listview----------------------->>   

        public async Task loadList()
        {       
            string postdataForList = "{\"date\":\"" + WeekStart.Text + "\"}";
            APICall callForList = new APICall("/API/ListMobile/ListForApproval", postdataForList, loadingIndicator);
            try
            {
               List<ListData> resultObjForListst = callForList.APICallResult<List<ListData>>();
                if (resultObjForListst != null)
                {                                                      
                    List.ItemsSource = resultObjForListst;
                    screenStackLayout.VerticalOptions = LayoutOptions.FillAndExpand;
                    List.IsVisible = true;              
               }
               else
                {
                    Device.BeginInvokeOnMainThread(async () =>
                    { 
                       await DisplayAlert("", "Please check network connection", "OK");
                    });
                }
            }
           catch (Exception)
            {
              Device.BeginInvokeOnMainThread(async () =>
               {
                   ErrorMessageData errorMessage = new ErrorMessageData();
                   errorMessage.Flag = false; errorMessage.Message = callForList.errorMessage.Message;
                });
            }

        }
        void Picker_tapped(object sender,EventArgs e)
            {
            PopupNavigation.PushAsync(new WeekStartPopUp(WeekStartList));
            MessagingCenter.Subscribe<MyMessage>(this, "WeekStartData", (value) =>
            {
                string receivedData = value.Myvalue;
                WeekStart.Text = receivedData;      

                  Device.BeginInvokeOnMainThread(async () =>
                {
                    try {
                        loadList();
                    }
                    catch(Exception Ex)
                    {

                    }

                });                       
            });
            }

}

感谢您的帮助。请告诉我是否需要其他信息。

1 个答案:

答案 0 :(得分:1)

第一

对于错误:sometimes gets Error as "Outof memmory exception",是否需要一次获取所有数据?如果没有,则只能获取所需的数据并动态更新页面。例如,可以使用分页来请求和显示数据。

此外,如果您确定有足够的可用内存,正在运行64位操作系统并且仍然出现异常,请转到Project properties-> Build标签,并确保设置x64作为平台目标。如下所示: enter image description here

第二

由于您的应用将包含更大的数据,因此我们强烈建议您使用MVVM模式。
因为MVVM模式有助于将应用程序的业务和表示逻辑与其UI完全分开。它还可以大大提高代码重用的机会,并使我们和UI设计人员在开发应用程序的各个部分时可以更轻松地进行协作。