Stalo Hadjitofi
Stalo Hadjitofi

Reputation: 15

Loop through 4 object lists & add their data in a ListView C# Xamarin.Forms

I am working on a Xamarin.Forms Project and I am at a dead-end of sorts. My issue is that I want to display user transactions which I pull from a server, in a listview, however I need four different pull requests to get all the data which means I have four different objects lists which I grouped by the transaction number as you can see in this screenshot:

The key transaction number can be seen and if you expand you'll see the other data within each transaction

Here is the code where I group the deserialised json lists with the common key:

                    var t = JsonConvert.DeserializeObject<List<trans_mod>>(transactions);
                    var l = JsonConvert.DeserializeObject<List<loc_mod>>(loc);
                    var d = JsonConvert.DeserializeObject<List<disc_mod>>(disc);
                    var it = JsonConvert.DeserializeObject<List<item_mod>>(itm);

                    var q = it.AsQueryable().GroupBy(g => g.trans).ToList();
                    var q2= d.AsQueryable().GroupBy(g => g.trans).ToList();
                    var q3 = l.AsQueryable().GroupBy(g => g.trans).ToList();
                    var q4 = t.AsQueryable().GroupBy(g => g.position).ToList();

Object Models for each list

 public class loc_mod
    {
        [DataMember]
        public string location { get; set; }

        [JsonProperty(PropertyName = "@modify_stamp")]
        public string stamp { get; set; }

        [JsonProperty(PropertyName = "$trans")]
        public string trans { get; set; }
    }

    public class disc_mod
    {
        [DataMember]
        public string discount { get; set; }

        [JsonProperty(PropertyName = "@modify_stamp")]
        public string stamp { get; set; }

        [JsonProperty(PropertyName = "$trans")]
        public string trans { get; set; }
    }

    public class item_mod
    {
        [JsonProperty(PropertyName = "item.price")]
        public string price { get; set; }

        [JsonProperty(PropertyName = "item.name")]
        public string name { get; set; }

        [JsonProperty(PropertyName = "@modify_stamp")]
        public string stamp { get; set; }

        [JsonProperty(PropertyName = "$trans")]
        public string trans { get; set; }
    }


public class trans_mod
{
    [DataMember]
    public string refer { get; set; }

    [DataMember]
    public string date { get; set; }

    [DataMember]
    public string time { get; set; }

    [DataMember]
    public int points { get; set; }

    [DataMember]
    public string _total { get; set; }

    [JsonProperty(PropertyName = "$$position")]
    public string position { get; set; }

    [JsonProperty(PropertyName = "@modify_stamp")]
    public string stamp { get; set; }

    [JsonProperty(PropertyName = "$trans")]
    public string trans { get; set; }
}


public class itms
{

    public string price { get; set; }


    public string name { get; set; }


    public DateTime stamp { get; set; }

    [JsonProperty(PropertyName = "$trans")]
    public string trans { get; set; }
}

What I want to do is to loop through all four lists and add the data from each list in the listview but I can't think of a way I can do that.

Listview Add() code Example:

Transactions.Add(new Transaction
                 {
                     Details = "Date: " + ti[i].date + " | Time: " + ti[i].time + " | 
                     Reference: " + ti[i].refer,
                     Isvisible = false, Items= ti[i].item, Total = ti[i].total, Discount 
                     = ti[i].discount
                 });

Sorry if this is a bit confusing, it's confusing for me as well as I am a relative beginner. Any help is welcome!

Upvotes: 1

Views: 125

Answers (1)

ToolmakerSteve
ToolmakerSteve

Reputation: 21223

Define an Interface that your item classes all implement.
That interface has a method that returns whatever you need for listview.

public Interface IHasTransaction
{
    Transaction GetTransaction();
}

public class loc_mod : IHasTransaction
{
    ...
    public Transaction GetTransaction()
    {
        // Use fields of this class to create a Transaction.
        return new Transaction(...);
    }
}

public class disc_mod : IHasTransaction
{
     ...
}

If you want, you can make a list that has a mixture of these:

public List<IHasTransaction> models = new List<IHasTransaction>();
models.Add(new loc_mod(...));
models.Add(new disc_mod(...));

Given any of these items

IHasTransaction model

You can easily get the corresponding Transaction:

model.GetTransaction()

OR

var lm = new loc_mod(...);
lm.GetTransaction()

Upvotes: 1

Related Questions