Android

[안드로이드] 안드로이드스튜디오(Android Studio), 확장 리스트뷰(ExpandableListView) 만들기, creating ExpandableListView, setGroupIndicator exam, 안드로이드 예제, 안드로이드 강좌

정보처리마법사 2016. 8. 19. 17:24
반응형

 

 

[안드로이드] 안드로이드스튜디오(Android Studio), 확장 리스트뷰(ExpandableListView) 만들기, creating ExpandableListView, setGroupIndicator exam, 안드로이드 예제, 안드로이드 강좌

 

 

참고 : 이미지서명은 제 와이프

파푸맘 블로그(http://blog.naver.com/bobe6294)

이미지서명입니다.  

 

 

 

안녕하세요 정보처리마법사 입니다.

 

이번 포스팅의 주제는 확장 리스트뷰(ExpandableListView) 만들기에 관한 내용입니다.

두 개의 그룹을 만들고 각각의 그룹에 아이템을 추가한 뒤 그룸이나 아이템을 클릭하면 어떤 그룹을 선택했는지 또는 아이템을 선택했는지 Toast로 보여주는 예제를 살펴보겠습니다.

 

레이아웃은 다음과 같이 ExpandableListView 로만 이루어져 있습니다.

레이아웃에는 데이터를 설정하는 부분이 없으므로 MainActivity.java 코드에서 데이터 설정 및 아이템을 선택했을 때의 처리를 모두 해줘야 합니다.

 

 

확장 리스트뷰의 그룹(Group)과 하위 아이템인 차일드(Child)를 클릭했을 때 무엇을 선택했는지를 알려주기 위해 토스트 메시지를 사용할 것이기 때문에 그룹과 차일드를 클릭한 것을 알아내야 합니다. 이럴 때 사용할 수 있는 것이 OnGroupClickListener 와 OnChildClickListener 인터페이스입니다. onGroupClickListener 인터페이스의 onGroupClick() 메소드가 그룹을 클릭했을 때 호출되는 메소드이며, OnChildClickListener 인터페이스의 onChildClick() 메소드가 차일드를 클릭했을 때 호출되는 메소드입니다.

 

 

listView.setOnGroupClickListener(this);

listView.setOnChildClickListener(this);

두 리스너의 인터페이스 메소드를 현재 클래스에 구현했으므로 this를 지정합니다.

 

public class MyExpandableListAdapter extends BaseExpandableListAdapter {

확장 리스트뷰에서 사용할 수 있는 기본 클래스인 BaseExpandableListAdapter를 상속해서 원하는 데이터들과 원하는 동작을 설정해야 합니다.

 

getChild() 메소드는 주어진 그룹 위치와 차일드 위치에 해당하는 차일드 아이템을 반환합니다. childs 변수는 MainActivity 클래스의 멤버 변수로 선언했습니다.

 

getChildId() 메소드는 차일드 아이디를 반환합니다. 차일드 아이디는 유일한 값이면 되므로 여기서는 childPosition을 그대로 사용했습니다. (배열 인덱스는 유일한 값이므로)

 

getChildrenCount() 메소드는 그룹에 속한 차일드 아이템의 개수를 반환합니다.

childs 배열 길이를 반환하면 됩니다.

 

 

getGenericView() 메소드는 그룹과 차일드 아이템을 보여줄 텍스트뷰를 직접 생성합니다. 이 메소드에서는 텍스트뷰의 레이아웃과 패딩을 직접 설정하고 있지만, 이렇게 하는 것보다는 인플레이션을 사용해서 하는 것이 더 나은 방법입니다.

 

[인플레이션 관련 정보 포스팅 새창 열기 링크]

 

getChildView() 메소드는 getGenericView() 메소드가 반환한 텍스트뷰에

차일드 아이템을 설정하고 반환합니다.

 

getGroup() 메소드는 주어진 그룹 위치에 해당하는 그룹 아이템을 반환합니다. groups 변수는 MianActivity 클래스의 멤버변수로 선언하였습니다.

 

getGroupCount() 메소드는 그룹의 개수를 반환합니다. groups 배열 길이를 반환하면 됩니다.

 

getGroupId() 메소드는 그룹 아이디를 반환합니다. 그룹아이디는 유일한 값이면 되므로

groupPosition을 그대로 사용합니다.

 

위 소스코드 에는 생략되었으나 그룹왼쪽에 아이콘을 보이고 하게 싶다면

 

setGroupIndicator() 메소드를 사용하면 되는데 사용방법은 다음과 같습니다.

아이콘을 보이게 하고 싶지 않을 때에는 listView.setGroupIndicator(null); 이런식으로 null값을 설정하면 되고 보이게 하고 싶다면 다음과 같이 Drawable 객체를 지정해주면 됩니다.

listView.setGroupIndicator(getResources().getDrawable(R.drawable.img01));

(물론 res/drawable 폴더에 img01 이미지가 있어야 하겠죠)

 

isChildSelectable()메소드는 차일드 아이템을 선택할 수 있다면 true를 반환하고, 아니라면 false를 반환하면 됩니다. 예제에서는 선택가능하게 할 것이므로 true를 반환하게 하였습니다.

 

hasStableIds() 메소드는 그룹과 차일드가 반환하는 아이디가 항상 일관된 아이디라면 true를, 아니라면 false를 반환하면 됩니다. 배열 인덱스는 항상 고정이므로 true를 반환했습니다.

 

onGroupClick() 메소드는 그룹을 클릭했을 때 호출되는 메소드입니다. 이 메소드에서는 Toast를 사용해서 클릭된 그룹 아이템을 보여주고 있습니다. 또한 이 메소드는 true나 false를 반환할 수 있는데, true는 이벤트를 모두 처리했다는 의미를 가지므로 발생한 이벤트를 소멸시킵니다. 이렇게 되면 그룹을 아무리 클릭해도 차일드 아이템들이 보이지 않는 문제가 발생하므로 반드시 false로 지정해야 합니다.

 

onChildClick() 메소드는 차일드를 클릭했을 때 호출되는 메소드입니다. 이 메소드는 true를 반환하고 있는데, onGroupClick()메소드와는 달리 이벤트를 더 처리할 것이 없기 때문입니다.

 

 

디바이스에서 애플리케이션을 실행했을 때 첫 화면입니다.

 

 

Number 를 클릭하면 리스트뷰가 확장이되고 Toast로 Group : Number 라는 메시지를 띄웁니다.

 

 

3을 클릭하니 토스트로 Child : 3 을 띄웁니다.

 

 

Alphabet 그룹을 클릭하니 리스트뷰가 확장되고 메시지를 띄웁니다.

 

 

B를 클릭하니 역시 이런 메시지를 띄웁니다.

 

 

Alphabet 을 한 번 더 클릭하니 확장되었던 리스트뷰가 접히면서 메시지를 띄웁니다.


 

이상으로 포스팅을 마칩니다. 감사합니다.


 


 




참고서적 : 200개의 단계별 예제로 배우는 안드로이드 4.0 [제이펍]






Fin.


잘 못 된 정보가 있으면 말씀해주세요~


공감버튼 클릭은 작성자에게 큰 힘이 됩니다.  행복한 하루 되세요.


 

 

 

반응형