2016-03-21 2 views
0

На этот раз я экспериментировал с ExpendableListView в моем приложении (с Xamarin.Android)Как загрузить данные Уплотненного JSON в ExpendableListView

Я последовал за учебник на этом сайте: http://www.codeproject.com/Articles/677206/MonoAndroid-Writing-ExpandableListView-amd

I удалось получить образец, работающий в моем собственном проекте, но теперь я пытаюсь загрузить мои данные json в расходуемое listview. У моего json есть вложенные объекты, и я не знаю, как я могу загрузить эти вложенные данные в одноразовый список.

То, что я хочу достичь, - это получить startTime (только дату) в заголовок и все остальное в пределах chargePointID и время в childview.

JSON

[ 
{ 
    "_id": "56e951fc2c559594037ceb7c", 
    "endTime": "2016-03-20T14:00:00.287Z", 
    "startTime": "2016-03-20T12:00:00.287Z", 
    "chargingPointID": { 
    "_id": "56e1815b78ac6b100f5de0d7", 
    "price": 5.55, 
    "type": "TypeBart", 
    "address": "Van Vaerenberghstraat 11, 2600 Antwerpen, Belgia" 
    }, 
    "userID": "56d05d7a475fec041bc2cab5", 
    "__v": 0, 
    "modified_at": "2016-03-16T12:30:52.034Z", 
    "created_at": "2016-03-16T12:30:52.034Z" 
}, 
{ 
    "_id": "56e952062c559594037ceb7d", 
    "endTime": "2016-03-20T18:00:00.287Z", 
    "startTime": "2016-03-20T17:00:00.287Z", 
    "chargingPointID": { 
    "_id": "56e1815b78ac6b100f5de0d7", 
    "price": 5.55, 
    "type": "TypeBart", 
    "address": "Van Vaerenberghstraat 11, 2600 Antwerpen, Belgia" 
    }, 
    "userID": "56d05d7a475fec041bc2cab5", 
    "__v": 0, 
    "modified_at": "2016-03-16T12:31:02.698Z", 
    "created_at": "2016-03-16T12:31:02.698Z" 
}, 
{ 
    "_id": "56e952182c559594037ceb7e", 
    "endTime": "2016-03-21T18:00:00.287Z", 
    "startTime": "2016-03-21T17:00:00.287Z", 
    "chargingPointID": { 
    "_id": "56e181d078ac6b100f5de0d8", 
    "price": 17.99, 
    "type": "TypeNG", 
    "address": "Osystraat 59, 2060 Antwerpen, Belgia" 
    }, 
    "userID": "56d05d7a475fec041bc2cab5", 
    "__v": 0, 
    "modified_at": "2016-03-16T12:31:20.655Z", 
    "created_at": "2016-03-16T12:31:20.655Z" 
} 
] 

ExpendListAdapter.cs

public class ExpendListAdapter: BaseExpandableListAdapter 
{ 
    Dictionary<string, List<string> > _dictGroup = null; 
    List<string> _lstGroupID = null; 
    Activity _activity; 

    public ExpendListAdapter (Activity activity, 
           Dictionary<string, List<string> > dictGroup) 
    { 
     _dictGroup = dictGroup; 
     _activity = activity; 
     _lstGroupID = dictGroup.Keys.ToList(); 

    } 

    #region implemented abstract members of BaseExpandableListAdapter 

    public override Java.Lang.Object GetChild (int groupPosition, int childPosition) 
    { 
     return _dictGroup [_lstGroupID [groupPosition]] [childPosition]; 
    } 

    public override long GetChildId (int groupPosition, int childPosition) 
    { 
     return childPosition; 
    } 

    public override int GetChildrenCount (int groupPosition) 
    { 
     return _dictGroup [_lstGroupID [groupPosition]].Count; 
    } 

    public override View GetChildView (int groupPosition, 
             int childPosition, 
             bool isLastChild, 
             View convertView, 
             ViewGroup parent) 
    { 
     var item = _dictGroup [_lstGroupID [groupPosition]] [childPosition]; 

     if (convertView == null) 
      convertView = _activity.LayoutInflater.Inflate (Resource.Layout.ListControl_ChildItem, null); 

     var textBox = convertView.FindViewById<TextView> (Resource.Id.txtSmall); 
     textBox.SetText (item, TextView.BufferType.Normal); 

     return convertView; 
    } 

    public override Java.Lang.Object GetGroup (int groupPosition) 
    { 
     return _lstGroupID [groupPosition]; 
    } 

    public override long GetGroupId (int groupPosition) 
    { 
     return groupPosition; 
    } 

    public override View GetGroupView (int groupPosition, bool isExpanded, View convertView, ViewGroup parent) 
    { 
     var item = _lstGroupID [groupPosition]; 

     if (convertView == null) 
      convertView = _activity.LayoutInflater.Inflate (Resource.Layout.ListControl_Group, null); 

     var textBox = convertView.FindViewById<TextView> (Resource.Id.txtLarge); 
     textBox.SetText (item, TextView.BufferType.Normal); 

     return convertView; 
    } 

    public override bool IsChildSelectable (int groupPosition, int childPosition) 
    { 
     return true; 
    } 

    public override int GroupCount { 
     get { 
      return _dictGroup.Count; 
     } 
    } 

    public override bool HasStableIds { 
     get { 
      return true; 
     } 
    } 

    #endregion 
} 

MyReservationActivity.cs

public class MyReservationsActivity : Activity 
{ 
    Button buttonMyHome; 

    Dictionary<string, List<string> > dictGroup = new Dictionary<string, List<string> >(); 
    List<string> lstKeys = new List<string>(); 

    List<MyReservationClass> result = new List<MyReservationClass>(); 

    protected async override void OnCreate (Bundle savedInstanceState) 
    { 
     base.OnCreate (savedInstanceState); 
     SetContentView (Resource.Layout.MyReservationsLayout); 

     CreateExpendableListData(); 

     var ctlExListBox = FindViewById<ExpandableListView> (Resource.Id.ctlExListBox); 
     ctlExListBox.SetAdapter (new ExpendListAdapter (this, dictGroup)); 

     buttonMyHome = FindViewById<Button> (Resource.Id.btn_home); 

     try { 
      string pathUrl = "reservations/myReservations/"; //locatie van laadpalen 
      string currentToken = Settings.Token; //steek token in variabele 
      string currentUserID = Settings.User_ID; 
      System.Diagnostics.Debug.WriteLine ("My token: " + currentToken); 

      var getResponse = await RequestClass.GetMyReservations (pathUrl, currentToken, currentUserID);//Doe een get request en steek response in variabele 
      System.Diagnostics.Debug.WriteLine ("My GETresponse: " + getResponse.ToString()); 

      result = JsonConvert.DeserializeObject<List<MyReservationClass>> (getResponse); 

     } catch (Exception ex) { 
      Console.WriteLine ("Check error: " + ex); 
     } 


     buttonMyHome.Click += ButtonMyHome_Click; 
    } 

    void ButtonMyHome_Click (object sender, EventArgs e) 
    { 
     StartActivity (typeof(HomeActivity)); 
     Finish(); 
    } 

    void CreateExpendableListData() 
    { 

     for (int i = 0; i < result.Count; i++) { 
      var lstChild = new List<string>(); 
      for (int j = 0; j < result [i].chargingPointID; j++) { 
       Console.WriteLine (j); 
      } 
      dictGroup.Add (string.Format (Convert.ToDateTime (result [i].startTime).ToShortDateString()), lstChild); 
     } 

     lstKeys = new List<string> (dictGroup.Keys); 

    } 
} 

если я это сделать: for (int j = 0; j < result [i].chargingPointID; j++)

я получу ошибку говоря следующее:

оператор «<» не может быть применен к операндам типа «INT» и «CharchingPointID»

Я также попытался это:

for (int i = 0; i < result.Count; i++) { 
      var lstChild = new List<string>(); 
      for (int j = 0; j < result.Count; j++) { 
       lstChild.Add (string.Format (Convert.ToDateTime (result [i].startTime).ToShortDateString(), result [i].chargingPointID)); 
      } 
      dictGroup.Add (string.Format (Convert.ToDateTime (result [i].startTime).ToShortDateString()), lstChild); 
     } 

Как петля через вложенными объекты получают значения и загружают их в список расходных материалов?

Может кто-нибудь помочь мне и немного объяснить это, пожалуйста?

Заранее благодарен!

+0

chargePointID - это объект, а не int - вы не можете использовать его в цикле for, подобном этому. Если каждый объект имеет один подзадач ChargingPointID, зачем нужен цикл for? – Jason

+0

@ Джейсон Да, я знаю, что charchingPointID - это объект. Но хотите поместить элементы в charchinPointID в childview из списка расходных материалов. Поэтому я подумал, что мне также нужно пройти через него, чтобы получить значения. Или я имею совершенно неправильное представление о том, как это сделать? – Season

ответ

0

Решено!

Было довольно легко. (Не знаю, почему я раньше не придумал это решение).

Просто добавлен дополнительный список для хранения объектов charchingPointID. И тогда петля juist над этим дополнительным списком, и вуаля! :)

void CreateExpendableListData() 
    { 

     for (int i = 0; i < sorted.Count; i++) { 
      var lstChild = new List<string>(); 

      var test = new List<string>(); 
      test.Add ("Address: " + sorted [i].chargingPointID.address); 
      test.Add ("Type: " + sorted [i].chargingPointID.type); 
      test.Add ("Price: €" + sorted [i].chargingPointID.price.ToString()); 

      for (int j = 0; j < test.Count; j++) { 
       lstChild.Add (test [j]); 
       Console.WriteLine (test [j]); 
      } 

      Console.WriteLine ("TEST LOOP: ", sorted [i].chargingPointID.address); 
      dictGroup.Add (string.Format (Convert.ToDateTime (sorted [i].startTime).ToShortDateString()), lstChild); 
     } 

     lstKeys = new List<string> (dictGroup.Keys); 
    } 
Смежные вопросы