На этот раз я экспериментировал с 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);
}
Как петля через вложенными объекты получают значения и загружают их в список расходных материалов?
Может кто-нибудь помочь мне и немного объяснить это, пожалуйста?
Заранее благодарен!
chargePointID - это объект, а не int - вы не можете использовать его в цикле for, подобном этому. Если каждый объект имеет один подзадач ChargingPointID, зачем нужен цикл for? – Jason
@ Джейсон Да, я знаю, что charchingPointID - это объект. Но хотите поместить элементы в charchinPointID в childview из списка расходных материалов. Поэтому я подумал, что мне также нужно пройти через него, чтобы получить значения. Или я имею совершенно неправильное представление о том, как это сделать? – Season