Closed8

Optimized ScrollView Adapter

trefuntrefun

雑感

デモのスクロールバーはぬるぬる動くし特に大量データに対するパフォーマンスはとてもよさそうだが、結構癖があり扱いが難しい

trefuntrefun

BasicListAdapter でシンプルなスクロールバーを作る

  1. GUI に沿って Canvas の Panel 上に OSA を作成

trefuntrefun
  1. スクロールしたいコンテンツの設定

今回はコンテンツが文字だけなので Text だけつけた Panel を Prefab にして TestOSA と同じ階層に置いておく。

このときスクリプトから変更したい要素の名前はメモっておく、今回の場合だと TitleText

作成した OSA(今回は TestOSA というオブジェクト名)の Item Prefab には作成した TestPanelPrefab を登録しておく

trefuntrefun
  1. スクリプトの変更

手順 1 の GUI での操作で自動生成されたスクリプト(今回だと BvasicListAdapter.cs)においてテキスト(とその色)を指定するようにスクリプトを変更する。

作成した Prefab の要素の名前は下記部分で使用するので注意

        root.GetComponentAtPath("TitleText", out titleText);

他の主な変更点

    protected override void UpdateViewsHolder(MyListItemViewsHolder newOrRecycled)
    {
        MyListItemModel model = Data[newOrRecycled.ItemIndex];
        newOrRecycled.UpdateTitleByItemIndex(model);
    }

    protected override void OnItemIndexChangedDueInsertOrRemove(MyListItemViewsHolder shiftedViewsHolder, int oldIndex, bool wasInsert, int removeOrInsertIndex)
    {
        base.OnItemIndexChangedDueInsertOrRemove(shiftedViewsHolder, oldIndex, wasInsert, removeOrInsertIndex);
   shiftedViewsHolder.UpdateTitleByItemIndex(Data[shiftedViewsHolder.ItemIndex]);

    }

// 中略

public class MyListItemModel
{
    public string title;
    public Color color;

    public MyListItemModel() { }

    public MyListItemModel(string _title, Color _color)
    {
        title = _title;
        color = _color;
    }
}

public class MyListItemViewsHolder : BaseItemViewsHolder
{
    public TextMeshProUGUI titleText;

    public override void CollectViews()
    {
        base.CollectViews();
        root.GetComponentAtPath("TitleText", out titleText);
    }

    public void UpdateTitleByItemIndex(MyListItemModel model)
    {
        titleText.text = model.title + " #" + ItemIndex;
    }

}

trefuntrefun
  1. テスト

テスト用に一個だけ要素を追加する関数を BasicListAdapter.cs に追加

    public void AddItemAt(int index, MyListItemModel item)
    {
        Data.InsertOne(index, item);
    }

適当なボタンを作成し、上記関数を呼ぶようにする。

    public void OnClickAdd()
    {
        MyListItemModel myItem = new MyListItemModel("aaa " + addCount.ToString(), new Color(1, 1, 1, 1));
        basicListAdapter.AddItemAt(0, myItem);
        addCount++;
    }
このスクラップは2023/07/12にクローズされました