[英]Remember selected day and show list after refresh
我有一個布局(我們稱它為WeekReservations),具有不同的textview,代表了本月的日子。 每天都有一個帶有預訂的列表視圖。 列表視圖每天都是不同的。 此外,您還可以在每個選定的日期進行預訂。
首次登陸WeekReservations
選擇一天之后
默認值,如果我登陸此頁面,則沒有選定的日期。 這意味着我要選擇一天才能看到列表視圖。 當我進行預訂並提交時,我將被帶回到WeekReservations頁面(要重定向回去,我刷新了此頁面)。
為了進行刷新,我使用了以下代碼行:
var intent = new Intent (this, typeof(WeekViewActivity));
intent.SetFlags (ActivityFlags.ClearTop);
StartActivity (intent);
所有數據將正確更新。 到這里為止一切正常。
但是問題是,當我被轉到“ WeekReservations”頁面時,在預定列表中看不到要進行預定的那一天。 我需要再次選擇日期(進行預訂的日期)才能查看我最近進行的預訂。
我試圖記住所選日期的ID,並將其傳遞給活動,然后將其傳遞回WeekReservations活動。 但這給了我一個錯誤。 因為如果這是第一次登陸該頁面,則不會有任何內容傳遞給WeekReservations活動。
我的問題是:
有沒有一種方法可以記住用戶選擇了哪一天(進行預訂),並在刷新后顯示此選定的日期以及預訂列表?
如果仍然不清楚我要問什么或缺少細節,請隨時指出。 我會盡力解釋自己
更新
下面是我到目前為止的代碼:
WeekViewActivity.cs
選擇日期並顯示列表視圖並進行預訂的代碼
namespace iChargeClassTest
{
[Activity (Label = "WeekViewActivity", Theme = "@android:style/Theme.NoTitleBar")]
public class WeekViewActivity : Activity
{
List<WeekReservationClass> result;
string myCPID;
string myCPAddress;
TextView showDay1, showDay2, showDay3, showDay4, showDay5, showDay6, showDay7, selectedDay;
Button makeBooking;
int totalDays;
DateTime chosenDateCP;
List<WeekReservationClass> newList = new List<WeekReservationClass> ();
private List<ReservationTime> myItems;
private ListView mListView;
protected async override void OnCreate (Bundle savedInstanceState)
{
base.OnCreate (savedInstanceState);
SetContentView (Resource.Layout.WeekViewLayout);
TextView showCurrentMonth = FindViewById<TextView> (Resource.Id.txtCurrentMonth);
showCurrentMonth.Text = DateTime.Now.ToMonthName ();
showDay1 = FindViewById<TextView> (Resource.Id.txtToday);
showDay2 = FindViewById<TextView> (Resource.Id.txtDay2);
showDay3 = FindViewById<TextView> (Resource.Id.txtDay3);
showDay4 = FindViewById<TextView> (Resource.Id.txtDay4);
showDay5 = FindViewById<TextView> (Resource.Id.txtDay5);
showDay6 = FindViewById<TextView> (Resource.Id.txtDay6);
showDay7 = FindViewById<TextView> (Resource.Id.txtDay7);
makeBooking = FindViewById<Button> (Resource.Id.btnBooking);
selectedDay = FindViewById<TextView> (Resource.Id.txtSelectedDay);
showDay1.Text = DateTime.Today.Day.ToString ();
showDay2.Text = DateTime.Today.AddDays (1).Day.ToString ();
showDay3.Text = DateTime.Today.AddDays (2).Day.ToString ();
showDay4.Text = DateTime.Today.AddDays (3).Day.ToString ();
showDay5.Text = DateTime.Today.AddDays (4).Day.ToString ();
showDay6.Text = DateTime.Today.AddDays (5).Day.ToString ();
showDay7.Text = DateTime.Today.AddDays (6).Day.ToString ();
mListView = FindViewById<ListView> (Resource.Id.myListView);
myItems = new List<ReservationTime> ();
myCPID = Settings.CharchingPoint_ID;
myCPAddress = Settings.CharchingPointAddress;
selectedDay.Text = myCPAddress;
//get all the reservations from webservice
try {
string pathUrl = "reservations/weekReservations/";
string currentToken = Settings.Token;
var getResponse = await RequestClass.GetData (pathUrl, currentToken);
result = JsonConvert.DeserializeObject<List<WeekReservationClass>> (getResponse);
} catch (Exception ex) {
Console.WriteLine ("Check error: " + ex);
}
showDay1.Click += ShowDay1_Click;
showDay2.Click += ShowDay2_Click;
showDay3.Click += ShowDay3_Click;
showDay4.Click += ShowDay4_Click;
showDay5.Click += ShowDay5_Click;
showDay6.Click += ShowDay6_Click;
showDay7.Click += ShowDay7_Click;
makeBooking.Click += MakeBooking_Click;
}
void MakeBooking_Click (object sender, EventArgs e)
{
Settings.ChosenReservationDate = chosenDateCP.ToString ();
Settings.CharchingPoint_ID = myCPID;
StartActivity (typeof(ReservationHoursActivity));
}
//get and show reservation in listview
void ShowDay7_Click (object sender, EventArgs e)
{
totalDays = int.Parse (showDay7.Text) - DateTime.Today.Day;
chosenDateCP = DateTime.Today.AddDays (totalDays);
myItems.Clear ();
newList.Clear ();
mListView.Adapter = null;
//loop through json to get only reservation for day 7
for (int i = 0; i < result.Count; i++) {
Console.WriteLine (Convert.ToDateTime (result [i].startTime));
if (Convert.ToDateTime (result [i].startTime).Date == chosenDateCP.Date && result [i].chargingPointID == myCPID) {
var newReservation = new WeekReservationClass ();
newReservation._id = result [i]._id;
newReservation.endTime = result [i].endTime;
newReservation.startTime = result [i].startTime;
newReservation.chargingPointID = result [i].chargingPointID;
newReservation.userID = result [i].userID;
newReservation.__v = result [i].__v;
newReservation.modified_at = result [i].modified_at;
newReservation.created_at = result [i].created_at;
newList.Add (newReservation);
} else {
Console.WriteLine ("failed");
}
}
//loop through filtered list and show in listview
for (int j = 0; j < newList.Count; j++) {
Console.WriteLine (newList [j].startTime);
myItems.Add (new ReservationTime () {
StartTime = Convert.ToDateTime (newList [j].startTime), EndTime = Convert.ToDateTime (newList [j].endTime)
});
}
MyListViewAdapter myadapter = new MyListViewAdapter (this, myItems);
if (myadapter.IsEmpty) {
Toast.MakeText (this, "There are no reservations for today", ToastLength.Long).Show ();
} else {
mListView.Adapter = myadapter;
}
}
void ShowDay6_Click (object sender, EventArgs e)
{
totalDays = int.Parse (showDay6.Text) - DateTime.Today.Day;
chosenDateCP = DateTime.Today.AddDays (totalDays);
myItems.Clear ();
newList.Clear ();
mListView.Adapter = null;
for (int i = 0; i < result.Count; i++) {
Console.WriteLine (Convert.ToDateTime (result [i].startTime));
if (Convert.ToDateTime (result [i].startTime).Date == chosenDateCP.Date && result [i].chargingPointID == myCPID) {
var newReservation = new WeekReservationClass ();
newReservation._id = result [i]._id;
newReservation.endTime = result [i].endTime;
newReservation.startTime = result [i].startTime;
newReservation.chargingPointID = result [i].chargingPointID;
newReservation.userID = result [i].userID;
newReservation.__v = result [i].__v;
newReservation.modified_at = result [i].modified_at;
newReservation.created_at = result [i].created_at;
newList.Add (newReservation);
} else {
Console.WriteLine ("failed");
}
}
for (int j = 0; j < newList.Count; j++) {
Console.WriteLine (newList [j].startTime);
myItems.Add (new ReservationTime () {
StartTime = Convert.ToDateTime (newList [j].startTime), EndTime = Convert.ToDateTime (newList [j].endTime)
});
}
MyListViewAdapter myadapter = new MyListViewAdapter (this, myItems);
if (myadapter.IsEmpty) {
Toast.MakeText (this, "There are no reservations for today", ToastLength.Long).Show ();
} else {
mListView.Adapter = myadapter;
}
}
}
}
ReservationHoursActivity.cs
進行預訂的代碼並將其提交給webwervice
namespace iChargeClassTest
{
[Activity (Label = "ReservationHoursActivity", Theme = "@android:style/Theme.NoTitleBar")]
public class ReservationHoursActivity : Activity, TimePickerDialog.IOnTimeSetListener
{
string myDate;
string myCP_ID;
string selectedButtonDate;
Button submitButtonMyslot;
protected override void OnCreate (Bundle savedInstanceState)
{
base.OnCreate (savedInstanceState);
SetContentView (Resource.Layout.ReservationHoursLayout);
myDate = Settings.ChosenReservationDate;
myCP_ID = Settings.CharchingPoint_ID;
submitButtonMyslot = FindViewById<Button> (Resource.Id.btnSubmitSlot);
submitButtonMyslot.Click += SubmitButtonMyslot_Click;
/*
Code for time picker
*/
}
/*
methodes for time picker
*/
//submit reservation
async void SubmitButtonMyslot_Click (object sender, EventArgs e)
{
//post submitted data to webservice
try {
string stringDateTimeEND = Convert.ToDateTime (myDate).ToShortDateString () + " " + Convert.ToDateTime (time_display_End.Text).ToLongTimeString ();
string stringDateTimeSTART = Convert.ToDateTime (myDate).ToShortDateString () + " " + Convert.ToDateTime (time_display_Start.Text).ToLongTimeString ();
DateTime dtEnd = Convert.ToDateTime (stringDateTimeEND);
DateTime dtStart = Convert.ToDateTime (stringDateTimeSTART);
string utcEnd = dtEnd.ToUniversalTime ().ToString ("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");
string utcStart = dtStart.ToUniversalTime ().ToString ("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");
var postData = "endTime=" + utcEnd;
postData += "&startTime=" + utcStart;
postData += "&chargingPointID=" + myCP_ID;
postData += "&userID=" + Settings.User_ID;
string pathUrl = "reservations/add";
var post_response = await RequestClass.PostData (postData, pathUrl, Settings.Token);
Toast.MakeText (this, "Your Booking is succefully send!", ToastLength.Long).Show ();
//restart weekactivity to refresh
var intent = new Intent (this, typeof(WeekViewActivity));
intent.SetFlags (ActivityFlags.ClearTop);
StartActivity (intent);
Finish ();//close the reservationHoursActivity
} catch (WebException exception) {
string responseText;
using (var reader = new StreamReader (exception.Response.GetResponseStream ())) {
responseText = reader.ReadToEnd ();
Console.WriteLine (responseText);
}
Toast.MakeText (this, "Reservation Failed!", ToastLength.Long).Show ();
}
}
}
}
添加新的預訂后,您不應該重新啟動活動。 您應該使用StartActivityForResult
打開“新預訂”活動,然后在OnActivityResult
覆蓋方法中處理返回的值。
您實際上不需要返回任何內容,只需單擊OK(確定)結果即可知道刷新數據(取消添加的用戶將返回Cancel(取消)結果)。
所以像...
private void AddReservationButtonClick(object sender, EventArgs e)
{
var intent = new Intent(this, typeof(AddReservationActivity));
StartActivityForResult(intent, 1000); // 1000 is just a random number, though it needs to match the value in OnActivityResult
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
if (resultCode == Result.Cancelled)
{
// user cancelled the reservation add, so don't refresh
return;
}
if (requestCode == 1000)
{
RefreshReservationData();
}
}
這樣可以避免重新創建活動,這可能會節省內存。 它還可以解決您記住所選日期的問題,因為仍會選擇該日期。
這是子活動讓父活動知道已完成某件事的典型方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.