확장 리스트뷰(ExpandableListView)란?
확장 리스트뷰(ExpandableListView)는 안드로이드에서 제공하는 위젯으로, 리스트를 확장하여 하위 리스트를 보여줄 수 있는 기능을 제공합니다. 이를 통해 사용자는 상위 레벨의 항목을 터치하면 하위 레벨 항목이 펼쳐지고 숨겨진 항목을 볼 수 있습니다. 이로써 계층 구조를 가진 데이터를 효과적으로 표현할 수 있습니다.
ExpandableListView 구성 요소
확장 리스트뷰는 크게 두 가지 요소로 구성됩니다.
- 상위 레벨 항목(부모 항목)
- 펼쳐질 하위 레벨 항목(자식 항목)
마치 폴더와 파일 구조를 연상시키는데, 폴더는 상위 레벨 항목이 되고 파일은 하위 레벨 항목이 됩니다. 확장 리스트뷰는 이러한 계층 구조를 자동으로 처리해주기 때문에 우리는 각 항목들을 xml 레이아웃 파일에 정의하고, 어댑터를 통해 리스트뷰에 데이터를 제공해주기만 하면 됩니다.
확장 리스트뷰 사용법
확장 리스트뷰를 사용하기 위해서는 아래의 단계를 따라야 합니다.
- 리소스 파일에서 리스트 항목들의 레이아웃을 정의합니다.
- 데이터를 포함한 모델 클래스를 생성합니다.
- 확장 리스트뷰의 어댑터를 생성하고 해당 어댑터를 리스트뷰에 연결합니다.
- 확장 리스트뷰의 이벤트 처리를 위해 리스너를 구현합니다.
리소스 파일에서 리스트 항목 레이아웃 정의하기
첫 번째 단계는 리스트 항목의 레이아웃을 정의하는 것입니다. 확장 리스트뷰의 리스트 항목은 상위 레벨 항목과 하위 레벨 항목 두 가지를 포함해야 합니다. 이를 위해 두 개의 레이아웃을 생성하고, 각각 parent_item.xml과 child_item.xml로 명명하겠습니다.
parent_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp">
<ImageView
android:id="@+id/parent_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
... />
<TextView
android:id="@+id/parent_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
... />
</LinearLayout>
child_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp">
<ImageView
android:id="@+id/child_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
... />
<TextView
android:id="@+id/child_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
... />
</LinearLayout>
모델 클래스 생성
데이터를 포함한 모델 클래스를 생성해야 합니다. 이 클래스는 상위 레벨 항목과 하위 레벨 항목 모두를 표현할 수 있어야 합니다. 예를 들어, 각 항목은 제목과 아이콘을 가지고 있을 수 있습니다.
public class Item {
private String title;
private int icon;
public Item(String title, int icon) {
this.title = title;
this.icon = icon;
}
public String getTitle() {
return title;
}
public int getIcon() {
return icon;
}
}
어댑터 생성 및 연결
모델 클래스를 기반으로 어댑터를 생성해야 합니다. 이 어댑터는 리스트뷰에 모델 데이터를 제공해줄 역할을 합니다.
public class ExpandableListAdapter extends BaseExpandableListAdapter {
private Context context;
private List<Item> items;
public ExpandableListAdapter(Context context, List<Item> items) {
this.context = context;
this.items = items;
}
// 필요한 메소드들 오버라이드
@Override
public Object getChild(int groupPosition, int childPosition) {
// ...
}
@Override
public long getChildId(int groupPosition, int childPosition) {
// ...
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
// ...
}
@Override
public int getChildrenCount(int groupPosition) {
// ...
}
@Override
public Object getGroup(int groupPosition) {
// ...
}
@Override
public int getGroupCount() {
// ...
}
@Override
public void onGroupCollapsed(int groupPosition) {
// ...
}
@Override
public void onGroupExpanded(int groupPosition) {
// ...
}
@Override
public long getGroupId(int groupPosition) {
// ...
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
// ...
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
// ...
}
@Override
public boolean hasStableIds() {
// ...
}
}
어댑터를 생성하고 연결하는 코드는 아래와 같습니다.
List<Item> items = new ArrayList<>();
items.add(new Item("Parent 1", R.drawable.ic_parent));
items.add(new Item("Parent 2", R.drawable.ic_parent));
ExpandableListAdapter adapter = new ExpandableListAdapter(this, items);
ExpandableListView listView = findViewById(R.id.expandable_list_view);
listView.setAdapter(adapter);
이벤트 처리 리스너 구현
마지막으로 확장 리스트뷰의 이벤트 처리를 위해 리스너를 구현해야 합니다. 이 부분은 필요한 경우에만 구현하시면 됩니다.
listView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
@Override
public void onGroupExpand(int groupPosition) {
// ...
}
});
listView.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int groupPosition) {
// ...
}
});
전체 내용 정리
확장 리스트뷰(ExpandableListView)는 안드로이드에서 계층 구조를 가진 데이터를 효과적으로 표현하기 위해 사용하는 위젯입니다. 확장 리스트뷰는 상위 레벨 항목과 하위 레벨 항목으로 구성되어 있으며, 각 항목은 xml 레이아웃 파일로 정의하고 어댑터를 통해 리스트뷰에 연결하는 방식으로 사용됩니다. 이를 통해 사용자는 상위 항목을 터치하면 하위 항목이 펼쳐지고 숨겨진 항목을 볼 수 있습니다. 이벤트 처리를 위한 리스너를 구현함으로써 더 다양한 기능을 추가할 수 있습니다.
댓글