簡體   English   中英

記住所選日期並刷新后顯示列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM