首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有选择器的xamarin.forms更新列表视图

带有选择器的xamarin.forms更新列表视图
EN

Stack Overflow用户
提问于 2019-06-22 18:41:54
回答 1查看 262关注 0票数 0

我有xamarin应用程序,它的顶部有一个选择器,在it.When下面有一个列表视图,该应用程序启动后,在根据选择器值执行另一个API调用并加载列表视图之后,该应用程序上的数据将从web API.Then绑定。当用户更改选择器的值时,应该更新listview,我没有使用任何视图模型,我有一个API调用的助手类,我正在将json结果设置为一个列表,并将它设置为我的Listview的项目源。我以某种方式实现了它,但它并不顺利,有时当我更改picker.NB的值时,它会以“”的形式获得错误:我使用的是带有Rg.popup.Plugin的自定义选择器。它将选定的值设置为标签。

我的问题是

  1. 这是加载列表视图的正确方式吗?在更改listview值时,该列表视图将进行更新?我该做什么更正?
  2. 对于这个场景,我应该使用视图模型(MVVM)模式吗?我的列表将包含更大的数据。

My xamal.cs NB:APICall类将以正确的格式返回json。

代码语言:javascript
复制
  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)
                    {

                    }

                });                       
            });
            }

}

任何帮助都是appreciated.Please,如果需要其他信息,请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-24 09:53:33

First

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

此外,如果您确定您有足够的空闲内存,运行64位操作系统,并且仍然有异常,请转到Project properties -> Build选项卡,并确保将x64设置为平台target.just,如下所示:

第二

由于您的应用程序将包含更大的数据,我们强烈建议您使用MVVM模式。

因为MVVM模式有助于将应用程序的业务和表示逻辑与其UI清晰地分离开来。它还可以极大地改善代码重用的机会,并允许我们和UI设计人员在开发应用程序的各个部分时更容易地进行协作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56718168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档