C# 如何将嵌套的JSON数据加载到ExpandableListView中

C# 如何将嵌套的JSON数据加载到ExpandableListView中,c#,json,listview,xamarin,xamarin.android,C#,Json,Listview,Xamarin,Xamarin.android,这次我在我的应用程序(使用Xamarin.Android)中试用了ExpandableListView 我遵循了本网站上的教程: 我设法让这个示例在我自己的项目中工作,但现在我正试图将我的json数据加载到可消耗的listview中。我的json有嵌套对象,我不知道如何将这些嵌套数据加载到可消耗的listview中 我想要实现的是将startTime(仅日期)放入标题,并将chargingPointID和time内的所有其他内容放入childview JSON [ { "_id": "56

这次我在我的应用程序(使用Xamarin.Android)中试用了ExpandableListView

我遵循了本网站上的教程:

我设法让这个示例在我自己的项目中工作,但现在我正试图将我的json数据加载到可消耗的listview中。我的json有嵌套对象,我不知道如何将这些嵌套数据加载到可消耗的listview中

我想要实现的是将startTime(仅日期)放入标题,并将chargingPointID和time内的所有其他内容放入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"
}
]
expenselistadapter.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
}
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);

    }
}
公共类ExpenseListAdapter:BaseExpandableListAdapter
{
字典_dictGroup=null;
列表lstGroupID=null;
活动(u)活动;;
公共支出清单适配器(活动,
字典组)
{
_dictGroup=dictGroup;
_活动=活动;
_lstGroupID=dictGroup.Keys.ToList();
}
#区域实现的BaseExpandableListAdapter的抽象成员
public override Java.Lang.Object GetChild(int-groupPosition,int-childPosition)
{
返回_dictGroup[_lstGroupID[groupPosition]][childPosition];
}
公共覆盖长GetChildId(int-groupPosition,int-childPosition)
{
返回子位置;
}
公共覆盖int GetChildrenCount(int groupPosition)
{
返回_dictGroup[_lstGroupID[groupPosition]].Count;
}
公共覆盖视图GetChildView(int groupPosition,
int-childPosition,
布尔·伊斯拉斯特儿童,
视图转换视图,
视图组(父级)
{
变量项=_dictGroup[_lstGroupID[groupPosition]][childPosition];
if(convertView==null)
convertView=\u activity.LayoutInflater.Inflate(Resource.Layout.ListControl\u ChildItem,null);
var textBox=convertView.findviewbyd(Resource.Id.txtsall);
textBox.SetText(项,TextView.BufferType.Normal);
返回视图;
}
public override Java.Lang.Object GetGroup(int-groupPosition)
{
返回lstGroupID[groupPosition];
}
公共覆盖长GetGroupId(int-groupPosition)
{
返回组位置;
}
公共覆盖视图GetGroupView(int-groupPosition、bool-isExpanded、视图转换视图、视图组父级)
{
变量项=lstGroupID[groupPosition];
if(convertView==null)
convertView=_activity.LayoutInflater.Inflate(Resource.Layout.ListControl_组,null);
var textBox=convertView.findviewbyd(Resource.Id.txtlagle);
textBox.SetText(项,TextView.BufferType.Normal);
返回视图;
}
公共覆盖bool ischildselect(int-groupPosition,int-childPosition)
{
返回true;
}
公共覆盖int-GroupCount{
得到{
返回_dictGroup.Count;
}
}
公共覆盖布尔表ID{
得到{
返回true;
}
}
#端区
}
MyReservationActivity.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
}
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);

    }
}
公共类MyReservationsActivity:活动
{
纽扣家庭;
Dictionary dictGroup=新字典();
List lstKeys=新列表();
列表结果=新列表();
创建时受保护的异步重写void(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.MyReservationsLayout);
createExpandableListData();
var ctlExListBox=findviewbyd(Resource.Id.ctlExListBox);
ctlExListBox.SetAdapter(新的ExpertListAdapter(这个,dictGroup));
buttonMyHome=findviewbyd(Resource.Id.btn\u home);
试一试{
string pathUrl=“reservations/myReservations/”;//locatie van laadpalen
string currentToken=Settings.Token;//变量中的steek标记
字符串currentUserID=Settings.User\u ID;
System.Diagnostics.Debug.WriteLine(“我的令牌:+currentToken”);
var getResponse=await RequestClass.GetMyReservations(路径URL、当前令牌、当前用户ID);//Doe甚至在variabele中获取请求和steek响应
System.Diagnostics.Debug.WriteLine(“我的GETresponse:+GETresponse.ToString());
结果=JsonConvert.DeserializeObject(getResponse);
}捕获(例外情况除外){
Console.WriteLine(“检查错误:+ex”);
}
buttonMyHome.Click+=buttonMyHome\u Click;
}
无效按钮主页单击(对象发送者,事件参数e)
{
StartActivity(家庭活动类型);
完成();
}
作废CreateExpandableListData()
{
for(int i=0;i
如果我这样做:
for(int j=0;j

我将得到一个错误,如下所示:

操作员解决了它

这很容易。(不知道为什么我之前没有想出这个解决方案)

刚刚添加了一个额外的列表来存储对象charchingPointID的项。 然后juist在那个额外的列表上循环,瞧!:)

void createExpandableListData()
{
for(int i=0;i