본문 바로가기
카테고리 없음

확장 리스트뷰 만들기(ExpandableListView)

by kangs' tong 2023. 12. 7.

확장 리스트뷰(ExpandableListView)란?

확장 리스트뷰(ExpandableListView)는 안드로이드에서 제공하는 위젯으로, 리스트를 확장하여 하위 리스트를 보여줄 수 있는 기능을 제공합니다. 이를 통해 사용자는 상위 레벨의 항목을 터치하면 하위 레벨 항목이 펼쳐지고 숨겨진 항목을 볼 수 있습니다. 이로써 계층 구조를 가진 데이터를 효과적으로 표현할 수 있습니다.

ExpandableListView 구성 요소

확장 리스트뷰는 크게 두 가지 요소로 구성됩니다.

  1. 상위 레벨 항목(부모 항목)
  2. 펼쳐질 하위 레벨 항목(자식 항목)

마치 폴더와 파일 구조를 연상시키는데, 폴더는 상위 레벨 항목이 되고 파일은 하위 레벨 항목이 됩니다. 확장 리스트뷰는 이러한 계층 구조를 자동으로 처리해주기 때문에 우리는 각 항목들을 xml 레이아웃 파일에 정의하고, 어댑터를 통해 리스트뷰에 데이터를 제공해주기만 하면 됩니다.

확장 리스트뷰 사용법

확장 리스트뷰를 사용하기 위해서는 아래의 단계를 따라야 합니다.

  1. 리소스 파일에서 리스트 항목들의 레이아웃을 정의합니다.
  2. 데이터를 포함한 모델 클래스를 생성합니다.
  3. 확장 리스트뷰의 어댑터를 생성하고 해당 어댑터를 리스트뷰에 연결합니다.
  4. 확장 리스트뷰의 이벤트 처리를 위해 리스너를 구현합니다.

리소스 파일에서 리스트 항목 레이아웃 정의하기

첫 번째 단계는 리스트 항목의 레이아웃을 정의하는 것입니다. 확장 리스트뷰의 리스트 항목은 상위 레벨 항목과 하위 레벨 항목 두 가지를 포함해야 합니다. 이를 위해 두 개의 레이아웃을 생성하고, 각각 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 레이아웃 파일로 정의하고 어댑터를 통해 리스트뷰에 연결하는 방식으로 사용됩니다. 이를 통해 사용자는 상위 항목을 터치하면 하위 항목이 펼쳐지고 숨겨진 항목을 볼 수 있습니다. 이벤트 처리를 위한 리스너를 구현함으로써 더 다양한 기능을 추가할 수 있습니다.

댓글