Как отобразить элементы в соответствии с категориями из уже загруженного списка всех моделей в Unity?

#c# #unity3d

#c# #unity-игровой движок

Вопрос:

Я загрузил список изображений и их детали из API в автоматически разворачиваемый gridview.Ниже приведен код о том, как я загрузил детали из API в gridview.У меня есть меню гамбургеров с левой стороны.Он имеет вид категории.Например, если у меня много динамических категорий, как я буду отображать в Gridview уже загруженные изображения и детали.

 List<int> assetiid = new List<int>();
List<string> productname = new List<string>();
List<string> productcatogery = new List<string>();
List<string> productcatogeryid = new List<string>();
List<string> productdesc = new List<string>();
List<int> assetpriceurl = new List<int>();
List<string> assetimageurl = new List<string>();
List<string> assetimageurl1 = new List<string>();
List<string> assetimageurl2 = new List<string>();
List<string> assetimageurl3 = new List<string>();


List<string> assetmodelurl = new List<string>();


string JSONDataString;


public static PopulateGrid Instancepop;

public void Awake()
{
    Instancepop = this;
}


// Use this for initialization
public void Start ()
{
    StartCoroutine(GetData());

}

// Update is called once per frame
void Update () 
{


}

IEnumerator GetData()
{

    string URL = "http://test.com/test/api/products";//fake api
    WWW readjson = new WWW(URL);
    yield return readjson;

    if (string.IsNullOrEmpty(readjson.error))
    {

        JSONDataString = readjson.text;
    }

    JSONNode JNode = SimpleJSON.JSON.Parse(JSONDataString);

    for (int i = 0; i < JNode.Count; i  )
    {
        //Debug.Log("Image URLS before = "   JNode[i]["product_images"][0]);
        assetiid.Add(JNode[i]["id"]);
        productname.Add(JNode[i]["product_name"]);
        productcatogery.Add(JNode[i]["product_category"]);
        productcatogeryid.Add(JNode[i]["product_category_id"]);
        productdesc.Add(JNode[i]["product_description"]);
        assetpriceurl.Add(JNode[i]["product_price"]);

        assetimageurl.Add(JNode[i]["product_images"][0]);
        assetimageurl1.Add(JNode[i]["product_images"][1]);
        assetimageurl2.Add(JNode[i]["product_images"][2]);
        assetimageurl3.Add(JNode[i]["product_images"][3]);

        assetmodelurl.Add(JNode[i]["product_model"]);


        Debug.Log("Image URLS = " assetimageurl[i] );


    }

    StartCoroutine(FillData());


}

IEnumerator FillData()
{
    //for (int i = 0; i < assetimageurl.Count; i  )
    for (int i = 0; i < assetimageurl.Count; i  )
    {
        Texture2D tex;
        tex = new Texture2D(150, 150, TextureFormat.DXT1, false);


        WWW imgurllinks = new WWW(assetimageurl[i]);
        yield return imgurllinks;

        if (string.IsNullOrEmpty(imgurllinks.error))
        {
            yield return null;

        }

        imgurllinks.LoadImageIntoTexture(tex);
        rimg.texture = tex;

        //RawImage newItem = Instantiate(rimg) as RawImage;
        //newItem.transform.SetParent(ParentTransform.transform,false);
        Productxt.text = productname[i];
        Pricetxt.text = assetpriceurl[i].ToString();

            Instantiate(Mainprefab, ParentTransform);

    }


}
  

Ниже приведен API сведений обо всех продуктах (полный API не показан)

 "id":1,"product_name":"Dining Chair ","product_category_id":3
  

Ниже приведен API категорий

 [{"id":1,"category":"Chairs"},{"id":2,"category":"Tables"},{"id":3,"category":"Beds"}]
  

«id» из Category API сопоставляется с «product_category_id» из Full products API, чтобы отображать их в соответствии с категориями.

Если я нажму стулья в представлении категории, я хочу показать все детали продуктов, которые имеют «product_category_id» = 3 из уже загруженных деталей

// Приведенная ниже функция находится в другом классе

 public void ButtonClickedOn(int buttonNo)
{
    buttonNo = Index;

    Debug.Log("Button clicked = "   buttonNo);

    if(buttonNo==0)
    {
 //Category 1 is clicked

    }

}
  

Просмотр категории

Комментарии:

1. Вы можете использовать Linq для упорядочивания ваших списков и данных. Похоже, у вас есть весь список, который вы хотите, и вы можете легко сравнить «id» с «product_category_id».

2. Как отображать из уже загруженных моделей. Должен ли я где-нибудь сохранить детали и позже использовать их, например, кеш.

3. ДА. Создайте словарь, который содержит данные для товаров по категориям.

Ответ №1:

Используйте Json.Используйте NET для десериализации вашей json в C# Object . Затем используйте linq для фильтрации вашего списка по специальной категории.

Вот простой console рабочий пример

 using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;

class ProductDetails
{
    public int id { get; set; }
    public string product_name { get; set; }
    public int product_category_id { get; set; }
}

class Category
{
    public int id { get; set; }
    public string category { get; set; }
}

class Program
{
    static void Main()
    {
        string productJson = @"[{'id': '1', 'product_name':'test', 'product_category_id': '1'},
                                {'id': '2', 'product_name':'Dining Chair', 'product_category_id': '3'},
                                {'id': '3', 'product_name':'Dining Chippsss', 'product_category_id': '3'}]";

        string categoryJson = @"[{ 'id':'1','category':'Chairs'},
                                { 'id':'2','category':'Tables'},
                                { 'id':'3','category':'Beds'}]";

        var categories = JsonConvert.DeserializeObject<List<Category>>(categoryJson);
        var products = JsonConvert.DeserializeObject<List<ProductDetails>>(productJson);

        // Finding tables category
        var query = (from x in products
                     where x.product_category_id == 3
                     select x);

        foreach (var product in query)
        {
            var category = categories.SingleOrDefault(x => x.id == product.product_category_id);

            Console.WriteLine("Product Name: "   product.product_name   
                              " - Product Category: "   category.category);
        }
    }
}