#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);
}
}
}