はじめに
「UGUI Super ScrollView」では項目の削除を実装することができます
作成例は上記の GitHub リポジトリの
「Assets/Example/05_DeleteItem/Example.unity」シーンで確認できます
作成例
ソースコード
スクロールの項目で使用するデータ
public sealed class ListItemData { private readonly string m_name; public string Name { get { return m_name; } } public bool IsChecked { get; set; } public ListItemData( string name ) { m_name = name; } }
スクロールの項目
using UnityEngine; using UnityEngine.UI; [DisallowMultipleComponent] public sealed class ListItemUI : MonoBehaviour { [SerializeField] private Button m_buttonUI = null; [SerializeField] private Text m_textUI = null; [SerializeField] private Toggle m_toggleUI = null; private ListItemData m_data; private void Awake() { m_buttonUI.onClick.AddListener( () => print( m_data.Name ) ); m_toggleUI.onValueChanged.AddListener( isChecked => { m_data.IsChecked = isChecked; } ); } public void SetDisp( ListItemData data ) { m_data = data; m_textUI.text = data.Name; m_toggleUI.isOn = data.IsChecked; } }
スクロールビュー
using SuperScrollView; using System.Linq; using UnityEngine; [DisallowMultipleComponent] public sealed class Example : MonoBehaviour { [SerializeField] private LoopListView2 m_view = null; [SerializeField] private ListItemUI m_original = null; private ListItemData[] m_list; private void Start() { m_list = Enumerable .Range( 0, 1000 ) .Select( c => ( c + 1 ).ToString( "0000" ) ) .Select( c => new ListItemData( c ) ) .ToArray() ; m_view.InitListView( m_list.Length, OnUpdate ); } private LoopListViewItem2 OnUpdate( LoopListView2 view, int index ) { if ( index < 0 || m_list.Length <= index ) return null; var data = m_list[ index ]; var itemObj = view.NewListViewItem( m_original.name ); var itemUI = itemObj.GetComponent<ListItemUI>(); itemUI.SetDisp( data ); return itemObj; } private void OnGUI() { if ( GUILayout.Button( "すべて選択" ) ) { foreach ( var n in m_list ) { n.IsChecked = true; } m_view.RefreshAllShownItem(); } if ( GUILayout.Button( "選択解除" ) ) { foreach ( var n in m_list ) { n.IsChecked = false; } m_view.RefreshAllShownItem(); } if ( GUILayout.Button( "削除" ) ) { if ( !m_list.Any( c => c.IsChecked ) ) return; m_list = m_list .Where( c => !c.IsChecked ) .ToArray() ; m_view.SetListItemCount( m_list.Length, false ); m_view.RefreshAllShownItem(); } } }
ゲームオブジェクト
スクロールの項目
スクロールビュー
スクロールビューを操作するクラス