我有一个xamarin表单应用程序,顶部有一个选择器,下面有一个列表视图。当应用程序启动时,选择器上的数据将通过Web API绑定,然后根据选择器的值进行另一个API调用并且列表视图将加载。当用户更改picker的值时,应该更新Listview。我没有使用任何viewmodel。我有一个用于API调用的帮助器类,并且将json结果设置为列表并将其设置为listview的itemsource。我以某种方式实现了它,但是它不平滑,并且当我更改picker.NB的值时有时会出错,并显示为“内存不足异常”。NB:我在Rg.popup.Plugin中使用了自定义选择器。会将所选值设置为标签。
我的问题是
我的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)
{
}
});
});
}
}
感谢您的帮助。请告诉我是否需要其他信息。
答案 0 :(得分:1)
第一
对于错误:sometimes gets Error as "Outof memmory exception"
,是否需要一次获取所有数据?如果没有,则只能获取所需的数据并动态更新页面。例如,可以使用分页来请求和显示数据。
此外,如果您确定有足够的可用内存,正在运行64位操作系统并且仍然出现异常,请转到Project properties
-> Build
标签,并确保设置x64
作为平台目标。如下所示:
第二
由于您的应用将包含更大的数据,因此我们强烈建议您使用MVVM模式。
因为MVVM模式有助于将应用程序的业务和表示逻辑与其UI完全分开。它还可以大大提高代码重用的机会,并使我们和UI设计人员在开发应用程序的各个部分时可以更轻松地进行协作。