Подскажите как правильно организовать подзагрузку данных для TableView чтобы не было лагов и было "правильно".
Имеется АПИ, с которого я получаю данные (АПИ свое, могу править как нужно). Допустим я вытягиваю 20 ближайших объектов и отдаю их в приложение. Они отображаются.
Далее пользователь просмотрев все 20 пытается промотать таблицу ниже 20 (у нас только 20 объектов есть), больше 20 не загружается, а нужно после 20 записей сделать еще 20 и тд.
Подскажите как правильно организовать и где подзагрузку данных для TableView - чтобы решить такую задачу ?
Вот мой исходный код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Jsonnn : MonoBehaviour
{
public RectTransform prefab;
public Text countText;
public RectTransform content;
public GameObject ItemPrefab;
public Sprite icon;
public int cells;
public void UpdateItems()
{
float height = prefab.rect.height;
if (height < 100 * cells)
{
height = 100 * cells;
}
string url = "http://62.113.112.195:8000/page/0";
WWW www = new WWW(url);
StartCoroutine(GetItems(www, results => OnReceivedModels(results)));
content.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, height);
content.SetPositionAndRotation(new Vector3(0, -height / 2, 0), Quaternion.Euler(0, 0, 0));
for (int i = 0; i < cells; i++)
{
GameObject cell = Instantiate(ItemPrefab);
cell.transform.SetParent(content.transform, false);
}
}
void OnReceivedModels(TestItemModel[] models)
{
foreach (Transform child in content)
{
Destroy(child.gameObject);
}
foreach (var model in models)
{
var instance = GameObject.Instantiate(prefab.gameObject) as GameObject;
instance.transform.SetParent(content, false);
InitializeItemView(instance, model);
}
}
void InitializeItemView(GameObject viewGameObject, TestItemModel model)
{
TestItemView view = new TestItemView(viewGameObject.transform);
view.titleText.text = model.title;
view.Time.GetComponentInChildren<Text>().text = model.time;
view.Day.GetComponentInChildren<Text>().text = model.day;
view.Year.GetComponentInChildren<Text>().text = model.year;
view.Dayweek.GetComponentInChildren<Text>().text = model.dayweek;
{
Debug.Log(view.titleText.text + " is clicked!");
}
}
IEnumerator GetItems(WWW www, System.Action<TestItemModel[]> callback)
{
yield return www;
if (www.error == null)
{
TestItemModel[] mList = JsonHelper.getJsonArray<TestItemModel>(www.text);
Debug.Log("WWW Success: " + www.text);
callback(mList);
}
else
{
TestItemModel[] errList = new TestItemModel[1];
errList[0] = new TestItemModel();
errList[0].title = www.error;
Debug.Log("WWW Error: " + www.error);
callback(errList);
}
}
public class TestItemView
{
public Text titleText;
public Text Time;
public Text Day;
public Text Dayweek;
public Text Year;
public TestItemView(Transform rootView)
{
titleText = rootView.Find("titleText").GetComponent<Text>();
Time = rootView.Find("Time").GetComponent<Text>();
Day = rootView.Find("Day").GetComponent<Text>();
Dayweek = rootView.Find("Dayweek").GetComponent<Text>();
Year = rootView.Find("Year").GetComponent<Text>();
}
}
[System.Serializable]
public class TestItemModel
{
public string title;
public string time;
public string day;
public string dayweek;
public string year;
}
public class JsonHelper
{
public static T[] getJsonArray<T>(string json)
{
string newJson = "{ \"array\": " + json + "}";
Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(newJson);
return wrapper.array;
}
public static string arrayToJson<T>(T[] array)
{
Wrapper<T> wrapper = new Wrapper<T>();
wrapper.array = array;
return JsonUtility.ToJson(wrapper);
}
[System.Serializable]
private class Wrapper<T>
{
public T[] array;
}
}
}