기본 콘텐츠로 건너뛰기

[UE] ListView





ListView (하고자 하는 것)




큐브 15개를 목록 뷰에 표시하고, 삭제하는 기능을 만들 것이다.
(액터를 태그를 이용해서 찾을 계획이기 때문에) 우선 큐브 15개의 태그를 임의로 지정한다.



데이터 구조

언리얼의 리스트 위젯에는 "ListView", "TileView", "TreeView"가 있다. (여기서는 ListView를 다룰것이다.) 표시하는 방법이 다르지만, 필요한 데이터는 아래의 3종류이다.




  • 데이터 구조체 (MyStruct) : 실 데이터. 리스트뷰와 데이터 테이블을 연동하는 경우가 있기 때문에 만든다.
  • 데이터 객체 (MyObject) : 리스트 뷰가 활용하는 실 데이터의 단위. 리스트 뷰의 이벤트 함수들이 Object(변수명 Item) 또는 Entry(변수명 Widget) 형태를 활용한다. 단순히 구조체를 한 번 감싸는 구조로 설계된다.
  • 엔드리 위젯 (MyEntry) : 리스트 뷰에 하나의 데이터를 어떠한 형태로 보여줄지 결정하는 UI

데이터 만들기

(Struct) 데이터 구조체


  • "콘덴츠 브라우저" 우클릭 → "블루프린트" → "구조체" 선택
  • 원하는 변수를 추가하고 저장


(Object) 데이터 오브젝트



  • "콘덴츠 브라우저" 우클릭 → "블루프린트" → "블루프린트 클래스" 선택
  • "모든 클래스" 부분에서 "Object"를 선택
  • 위에서 만들었던 구조체(MyStruct)를 변수에 추가하고 컴파일 및 저장
    • 변수 선택 후, 디테일 패널에서 "인스턴스 편집가능", "스폰시 노출" 부분에 체크를 하면, Object 생성시 Struct도 같이 설정할 수 있다. 

(Entry) 엔트리 위젯



  • "콘덴츠 브라우저" 우클릭 → "유저 인터페이스" → "위젯 블루프린트" 선택
  • "사용자 위젯" 선택
  • 위에서 만들었던 데이터 오브젝트(MyObejct)를 변수에 추가
  • "클래스 세팅" 을 클릭
  • "인터페이스" → "구현된 인터페이스" 부분에서 "추가" 부분을 클릭
  • "UserObjectListEntry" (사용자 오브젝트 리스트 항목)을 선택
    • 인터페이스 부분에 함수 4개가 추가된다.



적당히 디자인을 한다. (바인딩은 자유. 근데 잘 작동 안한다...)



ListView에 Entry 추가

  자신이 원하는 ListView를 만들거나 이미 있는 다른 UserWidget에 ListView를 추가한 다음 설정을 해도 된다. 여기에서는 후자의 방법으로 설계하였다.



  • 위 이미지는 PlayerController에 위젯을 생성하는 코드이다. (꼭 PlayerController가 아니어도 된다.)
    • "WBP_Panel" 이라는 임의로 만든 UserWidget 클래스 내부에 리스트 뷰를 추가할 것이다.



  • 생성한 리스뷰의 "리스트 엔트리" 부분에 위에서 만든 엔트리(WBP_MyListEntry)를 선택한다.




  위 이미지는 "SM_ChamferCube"라고 태그가 된 액터들을 가져와서 ListView에 추가하는 구문이다. (WBP_Panel 블루프린트에서 편집)
  • "Construct My Object" 노드를 만드는 방법
    • 블루프린트 빈공간 우클릭
    • "Construct Object form Class" 선택
    • "Class" 부분을 원하는 클래스로 설정

실행 (1차 시도)


실행을 하면 아래와 같은 결과가 나올 것이다.




데이터와 UI 연결 (데이터 Object와 Entry연결) 

(MyObject와 WBP_MyListEntry 연결)
  UI와 데이터를 연결하지 않았기 때문에 위 이미지와 같은 결과가 나오게 된다. Object의 정보를 Entry에 어떻게 연결할 것인지 추가해야 된다.
  Entry에 추가된 "UserObjectListEntry"의 함수 들 중에 "OnListItemObjectSet" 함수를 보면 다음과 같은 내용이 표시 된다. 




 "OnListItemObjectSet" 함수를 더블 클릭하면 이벤트로 추가되며 아래와 같이 노드를 만들면된다. 





실행 (2차 시도)







Event 처리 (아이템 사라짐, 삭제)

UserObjectListEntry의 "OnListItemObjectSet" 함수와 "OnEntryReleased"

두 함수에 설명을 보면 아래와 같다.

  • OnListItemObjectSet : 이 엔트리가 새로운 항목 오브젝트를 할당하여 자체 목록에 표시할 때 호출됩니다.
  • OnEntryReleased : Called when this entry is released from the owning table and no longer represents any list item. (테이블에서 해제 되어 목록에 더이상 보이지 않을 때 호출)

  ListView에서 Object가 실 데이터를 의미하고, Entry는 UI표시용이다. 즉, 일부의 Entry만 보일 정도로 ListView의 크기가 작다면, 보이는 Entry는 "OnListItemObjectSet" 함수를 호출하고 사라지는 Entry는 "OnEntryReleased" 함수가 호출된다.
  해당 함수를 확인 할 겸. Entry (WBP_MyListEntry) 블루프린트에서 생성자와의 관계를 파악 해볼겸 아래와 같이 노드를 만들어서 실행해보았다.
  ListView의 스크롤에 의해 Entry가 보임과 안보임에 따라 "OnListItemObjectSet" 함수와 "OnEntryReleased" 함수가 번갈아서 출력 된다. (움짤 만들기 귀찮다...)










ListView의 OnEntryReleased 함수


  ListView에는 OnEntryReleased라는 함수가 존재하는데, Entry의 EventOnEntryReleased와 역할이 같다. WBP_Panel에 있는 ListView에 아래 이미지와 같이 노드를 만들고 테스트 해보면, ListView의 함수가 Entry의 함수보다 나중에 출력 된다는 것을 확인 할 수 있다.
  Entry::OnEntryReleased 먼저 호출 → ListView::OnEntryReleased









ListView에서 아이템 삭제

버튼 이벤트 추가

  각 Entry에 있는 휴지통 버튼의 기능을 활성화 할 것이다. Entry(WBP_MyListEntry) 블루프린트에서 버튼 이벤트를 아래와 같이 만든다. 여기에서는 단순히 ListView에서 삭제하는 기능만 추가하였다.




OnEntryReleased 함수 처리


  Entry의 EventOnEntryReleased 함수와 ListView의 OnEntryReleased라는 함수는 ListView에서 해당 Entry가 보이지 않으면 호출이 된다. 
  따라서 ListView에서 완전 삭제인지 아니면 단순 Released인지 OnEntryReleased에 대한 추가 처리가 필요하다.
  여기서는 ListView의 OnEntryReleased에서 처리할 것이다.




실행


여기서는 액터를 따로 Sorting을 한 것이 아니기 때문에 월드에 배치된 순서대로 지워지지는 않는다.












Event 처리 (선택)

ListView의 선택 기능 설정

Entry의 선택 기능 설정


  Entry의 선택 상태가 변경 시 "OnItemSelectionChanged" 이벤트 함수가 호출된다. Entry(WBP_MyListEntry) 블루프린트에 아래와 같이 노드를 만들어서 ListView에서 선택한 Entry 아이템의 선택 상태를 변경한다.
  여기서는 Entry 선택 상태에 따라 Border의 색상을 바꾸는 "Change Border Color"라는 이름의 함수를 임의로 만들어 보았다.







ListView 옵션 설정

  ListView에는 Entry를 선택할 수 있는 기능을 설정할 수 있다. WBP_Panel에서 "디자이너" 탭 선택 후, ListView를 선택한 다음 "디테일" → "리스트 뷰" 부분에서 "선택 모드"와 "클릭 시 선택 지우기" 부분을 변경한다.



  ListView 부분에서 Entry 선택과 관련된 이벤트 함수는 다음과 같다. (다만 여기에서는 활용하지 않을 것이다.)

  • OnItemClicked : 아이템 한 번 클릭
    • SetItemSelection, SetSelectedIndex, SetSelectedItem 함수를 호출해도 이벤트가 발생하지 않음.
  • OnItemDoubleClicked : 아이템 더블 클릭
  • OnItemSelectionChanged : 아이템 선택 상태 변경
    • SetItemSelection, SetSelectedIndex, SetSelectedItem 함수를 호출하면 이벤트가 발생.

선택 상태 버그 수정


  ListView에서 Entry 아이템 한 개만 선택할 수 있도록 선택했음에도 불구하고 스크롤을 하다보면, 선택한 적이 없는 Entry 아이템이 선택된 상태임을 확인할 수 있다. (정작 출력로그에서는 선택 상태로 되어있지 않다.)
  ListView의 OnEntryInitialized 함수를 아래와 같이 만들면 해결할 수 있다.





실행





Event 처리 (이벤트 전달)

Entry에서 발생한 이벤트를 상위 View로 전달

  위의 예제처럼 Entry에 삭제 버튼의 경우에는 내부적으로 처리하였지만, 만약 외부(예 : 부모의 View)에 이벤트를 전달해야한다면 Dispatcher를 추가하면된다.  
  여기서는 단순 테스트를 위해 Entry에 별도의 버튼을 하나 추가하여 ListView의 부모View에서 처리하는 구문을 추가한다. 
  우선 아래와 같이 임의의 버튼을 하나 추가한다.



  View 내부에서 처리할 것이 아니고, 외부에 전달해야하기 때문에 임의의 Dispatcher 하나를 생성하여 버튼의 OnClick 이벤트와 연결한다.


   Blueprint 왼쪽 하단에 "이벤트 디스패처" 부분의 "+" 아이콘을 누르면 생성된다. 파라미터를 전달하고 싶으면 생성한 Dispatcher의 "디테일" 탭에서 "입력" 오른쪽 부분의 "+" 아이콘을 누르면 된다.
  주의 할 점은 Dispatcher의 속성 (예 : 파라미터 이름이나 개수, 타입 변경 등)을 변경할 때마다 노드를 수동으로 고쳐줘야 한다는 것이다. (어짜피 컴파일 에러가 떠서 어떤 노드를 수정해야 될 것인지 알려줄 것이다.)



ListView의 OnEntryGenerated함수


  Entry가 ListView에서 보일 때 호출된다. 단, (View에서 보이는) 모든 Entry들이 초기화가 완료된 후에 호출된다.
Entry::Construct → Entry::EventOnListItemObjectSet → ListView::OnEntryInitialized 함수들이 모두 호출된 후에 호출된다는 의미이다. Entry의 보임이 호출의 기준이기 때문에 Entry::EventOnListItemObjectSet, ListView::OnEntryInitialized함수들과 마찬가지로 여러번 호출된다. (어떤 의미로) OnEntryReleased와 대응되는 함수이다. 

Dispatcher 연결


  Entry에서 추가한 Dispatcher의 Event를 ListView::OnEntryGenerated에서는 Bind 노드를 생성하고, ListView::OnEntryReleased에서는 Unbind 노드를 생성하면 된다. 생성한 Bind와 Unbind노드의 빨간색 부분에 같은 Event를 연결한다. 생성하는 방법은 Bind 또는 Unbind의 노드의 빨간 부분의 링크를 끌어서 "이벤트 추가" → "Add Custom Event..."
  이렇게 하면 Entry가 보이면 Bind, 사라지면 Unbind를 하게 된다.
  만일 여기서 더 상위의 UserWidget에 전달해야 된다면, 임의의 Dispatcher 하나 추가한 후, Custom Event (Entry_OnClick_BtnWhoAmI)에 연결하고, 상위 View에서 Bind, Unbind하면 된다. 





실행










함수 호출 순서

동작 로그 분석

===Gist code start===

// ===================================================================================================
// 최초 Widget 초기화
[WBP_MyListEntry_C_0] [Entry] [Construct] :
[WBP_MyListEntry_C_0] [Entry] [Event On List Item Object Set] : 0
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 0
[WBP_MyListEntry_C_1] [Entry] [Construct] :
[WBP_MyListEntry_C_1] [Entry] [Event On List Item Object Set] : 1
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 1
[WBP_MyListEntry_C_2] [Entry] [Construct] :
[WBP_MyListEntry_C_2] [Entry] [Event On List Item Object Set] : 2
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 2
[WBP_MyListEntry_C_3] [Entry] [Construct] :
[WBP_MyListEntry_C_3] [Entry] [Event On List Item Object Set] : 3
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 3
[WBP_MyListEntry_C_4] [Entry] [Construct] :
[WBP_MyListEntry_C_4] [Entry] [Event On List Item Object Set] : 4
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 4
[WBP_MyListEntry_C_5] [Entry] [Construct] :
[WBP_MyListEntry_C_5] [Entry] [Event On List Item Object Set] : 5
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 5
[WBP_MyListEntry_C_6] [Entry] [Construct] :
[WBP_MyListEntry_C_6] [Entry] [Event On List Item Object Set] : 6
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 6
[WBP_MyListEntry_C_7] [Entry] [Construct] :
[WBP_MyListEntry_C_7] [Entry] [Event On List Item Object Set] : 7
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 7
[WBP_MyListEntry_C_8] [Entry] [Construct] :
[WBP_MyListEntry_C_8] [Entry] [Event On List Item Object Set] : 8
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 8
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 0
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 1
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 2
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 3
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 4
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 5
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 6
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 7
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 8
// ListView안에 들어있는 아이템 개수와는 상관없이 육안으로 보이는 드러나는 Entry만 초기화 코드가 실행된다.
// 각 Entry에 대해 순차적으로 "Entry::Construct(무조건 한번만 호출됨)" → "Entry::OnListItemObjectSet" → "ListView::OnEntryInitialized" 함수가 호출된다.
// 모든 Entry에 대해 "ListView::OnEntryInitialized"가 호출된 후, 새로 추가된 모든 Entry에 대해 "ListView::OnEntryGenerated" 함수가 호출된다.
// ===================================================================================================
// ===================================================================================================
// 스크롤 (아래로 갔다가 다시 위로)
[WBP_MyListEntry_C_9] [Entry] [Construct] :
[WBP_MyListEntry_C_9] [Entry] [Event On List Item Object Set] : 9
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 9
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 9
[WBP_MyListEntry_C_0] [Entry] [Event On Entry Released] : 0
[WBP_Panel_C_0] [ListView] [On Entry Released] : 0 (Just released)
[WBP_MyListEntry_C_0] [Entry] [Event On List Item Object Set] : 10
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 10
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 10
[WBP_MyListEntry_C_1] [Entry] [Event On Entry Released] : 1
[WBP_Panel_C_0] [ListView] [On Entry Released] : 1 (Just released)
[WBP_MyListEntry_C_1] [Entry] [Event On List Item Object Set] : 11
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 11
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 11
[WBP_MyListEntry_C_2] [Entry] [Event On Entry Released] : 2
[WBP_Panel_C_0] [ListView] [On Entry Released] : 2 (Just released)
[WBP_MyListEntry_C_2] [Entry] [Event On List Item Object Set] : 12
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 12
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 12
[WBP_MyListEntry_C_3] [Entry] [Event On Entry Released] : 3
[WBP_Panel_C_0] [ListView] [On Entry Released] : 3 (Just released)
[WBP_MyListEntry_C_3] [Entry] [Event On List Item Object Set] : 13
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 13
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 13
[WBP_MyListEntry_C_4] [Entry] [Event On Entry Released] : 4
[WBP_Panel_C_0] [ListView] [On Entry Released] : 4 (Just released)
[WBP_MyListEntry_C_4] [Entry] [Event On List Item Object Set] : 14
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 14
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 14
[WBP_MyListEntry_C_5] [Entry] [Event On Entry Released] : 5
[WBP_Panel_C_0] [ListView] [On Entry Released] : 5 (Just released)
[WBP_MyListEntry_C_5] [Entry] [Event On List Item Object Set] : 5
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 5
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 5
[WBP_MyListEntry_C_4] [Entry] [Event On Entry Released] : 14
[WBP_Panel_C_0] [ListView] [On Entry Released] : 14 (Just released)
[WBP_MyListEntry_C_4] [Entry] [Event On List Item Object Set] : 4
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 4
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 4
[WBP_MyListEntry_C_3] [Entry] [Event On Entry Released] : 13
[WBP_Panel_C_0] [ListView] [On Entry Released] : 13 (Just released)
[WBP_MyListEntry_C_3] [Entry] [Event On List Item Object Set] : 3
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 3
[WBP_MyListEntry_C_2] [Entry] [Event On Entry Released] : 12
[WBP_Panel_C_0] [ListView] [On Entry Released] : 12 (Just released)
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 3
[WBP_MyListEntry_C_2] [Entry] [Event On List Item Object Set] : 2
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 2
[WBP_MyListEntry_C_1] [Entry] [Event On Entry Released] : 11
[WBP_Panel_C_0] [ListView] [On Entry Released] : 11 (Just released)
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 2
[WBP_MyListEntry_C_1] [Entry] [Event On List Item Object Set] : 1
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 1
[WBP_MyListEntry_C_0] [Entry] [Event On Entry Released] : 10
[WBP_Panel_C_0] [ListView] [On Entry Released] : 10 (Just released)
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 1
[WBP_MyListEntry_C_0] [Entry] [Event On List Item Object Set] : 0
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 0
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 0
[WBP_MyListEntry_C_9] [Entry] [Event On Entry Released] : 9
[WBP_Panel_C_0] [ListView] [On Entry Released] : 9 (Just released)
// 사라지는 Entry는 "Entry::EventOnEntryReleased" → "ListView::OnEntryReleased" 를 순차적으로 호출된다.
// 보이게 되는 Entry는 위에 있는 [최초 Widget 초기화]에 호출된 함수를 다시 한번 씩 호출한다.
// 여기서 OnEntryGenerated 함수의 경우에는 (다른 Entry의) OnEntryReleased 함수 보다 빠르게 호출될 수도 있고, 느리게 호출될 수도 있다.
// ===================================================================================================
// ===================================================================================================
// ListView의 선택 모드는 "Single Toggle" 상태
//(아무 것도 선택되지 않은 상태에서) 최초 아이템 선택 (클릭)
[WBP_MyListEntry_C_3] [Entry] [Event On Item Selection Changed] : 3 : Select
[WBP_Panel_C_0] [ListView] [On Item Selection Changed] : 3 : Select
[WBP_Panel_C_0] [ListView] [On Item Clicked] : 3
// 선택한 아이템을 다시 선택 → ListView의 선택 모드가 "Single Toggle"이기 때문에 선택이 해제됨 ==============
ListView::OnItemSelectionChanged (Is Selected = false)가 호출되지 않음.........
[WBP_Panel_C_0] [ListView] [On Item Clicked] : 3
[WBP_MyListEntry_C_3] [Entry] [Event On Item Selection Changed] : 3 : Deselect
//아이템 선택 후, 다른 아이템 선택 ================================================================
[WBP_MyListEntry_C_7] [Entry] [Event On Item Selection Changed] : 7 : Select
[WBP_Panel_C_0] [ListView] [On Item Selection Changed] : 7 : Select
[WBP_Panel_C_0] [ListView] [On Item Clicked] : 7
[WBP_MyListEntry_C_1] [Entry] [Event On Item Selection Changed] : 1 : Select
[WBP_MyListEntry_C_7] [Entry] [Event On Item Selection Changed] : 7 : Deselect
[WBP_Panel_C_0] [ListView] [On Item Selection Changed] : 1 : Select
[WBP_Panel_C_0] [ListView] [On Item Clicked] : 1
//선택해제 Entry의 EventOnItemSelectionChanged (false)와 새로 선택되는 Entry의 EventOnItemSelectionChanged (true)의 순서가 바뀔수도 있다.
// ===================================================================================================
// ===================================================================================================
// 아이템 선택 상태에서 뷰 스크롤 (선택된 아이템이 사라지다가 다시 나타남) : 여기서는 1번이 선택된 아이템
(Scroll Down)
[WBP_MyListEntry_C_9] [Entry] [Event On List Item Object Set] : 8
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 8
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 8
[WBP_MyListEntry_C_0] [Entry] [Event On Entry Released] : 0
[WBP_Panel_C_0] [ListView] [On Entry Released] : 0 (Just released)
[WBP_MyListEntry_C_8] [Entry] [Event On List Item Object Set] : 9
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 9
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 9
[WBP_MyListEntry_C_1] [Entry] [Event On Entry Released] : 1
[WBP_Panel_C_0] [ListView] [On Entry Released] : 1 (Just released)
[WBP_MyListEntry_C_0] [Entry] [Event On List Item Object Set] : 10
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 10
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 10
[WBP_MyListEntry_C_1] [Entry] [Event On List Item Object Set] : 11
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 11
[WBP_MyListEntry_C_2] [Entry] [Event On Entry Released] : 2
[WBP_Panel_C_0] [ListView] [On Entry Released] : 2 (Just released)
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 11
[WBP_MyListEntry_C_3] [Entry] [Event On Entry Released] : 3
[WBP_Panel_C_0] [ListView] [On Entry Released] : 3 (Just released)
[WBP_MyListEntry_C_2] [Entry] [Event On List Item Object Set] : 12
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 12
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 12
[WBP_MyListEntry_C_4] [Entry] [Event On Entry Released] : 4
[WBP_Panel_C_0] [ListView] [On Entry Released] : 4 (Just released)
[WBP_MyListEntry_C_3] [Entry] [Event On List Item Object Set] : 13
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 13
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 13
[WBP_MyListEntry_C_5] [Entry] [Event On Entry Released] : 5
[WBP_Panel_C_0] [ListView] [On Entry Released] : 5 (Just released)
[WBP_MyListEntry_C_4] [Entry] [Event On List Item Object Set] : 14
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 14
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 14
[WBP_MyListEntry_C_6] [Entry] [Event On Entry Released] : 6
[WBP_Panel_C_0] [ListView] [On Entry Released] : 6 (Just released)
(Scroll Up) ===========================================================
[WBP_MyListEntry_C_4] [Entry] [Event On Entry Released] : 14
[WBP_Panel_C_0] [ListView] [On Entry Released] : 14 (Just released)
[WBP_MyListEntry_C_6] [Entry] [Event On List Item Object Set] : 5
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 5
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 5
[WBP_MyListEntry_C_3] [Entry] [Event On Entry Released] : 13
[WBP_Panel_C_0] [ListView] [On Entry Released] : 13 (Just released)
[WBP_MyListEntry_C_4] [Entry] [Event On List Item Object Set] : 4
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 4
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 4
[WBP_MyListEntry_C_2] [Entry] [Event On Entry Released] : 12
[WBP_Panel_C_0] [ListView] [On Entry Released] : 12 (Just released)
[WBP_MyListEntry_C_3] [Entry] [Event On List Item Object Set] : 3
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 3
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 3
[WBP_MyListEntry_C_1] [Entry] [Event On Entry Released] : 11
[WBP_Panel_C_0] [ListView] [On Entry Released] : 11 (Just released)
[WBP_MyListEntry_C_2] [Entry] [Event On List Item Object Set] : 2
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 2
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 2
[WBP_MyListEntry_C_0] [Entry] [Event On Entry Released] : 10
[WBP_Panel_C_0] [ListView] [On Entry Released] : 10 (Just released)
[WBP_MyListEntry_C_1] [Entry] [Event On List Item Object Set] : 1
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 1
[WBP_MyListEntry_C_1] [Entry] [Event On Item Selection Changed] : 1 : Select
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 1
[WBP_MyListEntry_C_8] [Entry] [Event On Entry Released] : 9
[WBP_Panel_C_0] [ListView] [On Entry Released] : 9 (Just released)
[WBP_MyListEntry_C_0] [Entry] [Event On List Item Object Set] : 0
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 0
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 0
[WBP_MyListEntry_C_9] [Entry] [Event On Entry Released] : 8
[WBP_Panel_C_0] [ListView] [On Entry Released] : 8 (Just released)
// 재 생성시 Entry::EventOnItemSelectionChanged가 다시 호출된다. (false의 경우는 잘...)
// ===================================================================================================
// ===================================================================================================
선택된 아이템 삭제
[WBP_MyListEntry_C_8] [Entry] [Event On List Item Object Set] : 8
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 8
[WBP_MyListEntry_C_1] [Entry] [Event On Entry Released] : 1
[WBP_Panel_C_0] [ListView] [On Entry Released] : 1 (Destroy Actor)
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 8
(선택되지 않은) 일반 아이템 삭제
[WBP_MyListEntry_C_9] [Entry] [Event On List Item Object Set] : 9
[WBP_Panel_C_0] [ListView] [On Entry Initialized] : 9
[WBP_MyListEntry_C_6] [Entry] [Event On Entry Released] : 5
[WBP_Panel_C_0] [ListView] [On Entry Released] : 5 (Destroy Actor)
[WBP_Panel_C_0] [ListView] [On Entry Generated] : 9
// 단순 ListView::RemoveItem 함수만으로는 OnItemSelectionChanged 함수가 호출되지 않는다.
// ===================================================================================================

===Gist code end===

함수 정리


초기 아이템 생성 (Entry 생성)

  • Entry - Construct : (단 한번만 호출)
  • Entry - Event On List Item Object Set
  • ListView - On Entry Initialized
  • ListView - On Entry Generated : (다른 아이템에 대하여 위의 함수들이 모두 완료된 후)

Entry 사라짐


  • Entry - Event On Entry Released
  • ListView - On Entry Released


아이템 선택


  • Entry - Event On Item Selection Changed
    • 아이템 비/선택 시 ListView의 것 보다 먼저 호출
    • (선택된) 아이템 삭제 시에는 호출되지 않음
  • ListView - On Item Selection Changed
    • (특이하게도) Deselect 일 경우에는 호출이 안된다???
    • (선택된) 아이템 삭제 시에는 호출되지 않음
  • ListView - On Item Clicked
    • SetItemSelection, SetSelectedIndex, SetSelectedItem 함수를 호출해도 이벤트가 발생하지 않음.




참고 자료















































댓글