본문 바로가기

Android

(Part.2) 리사이클러뷰에서 여러가지 타입의 데이터 사용하기

목표

  • 하나의 어댑터에서 여러가지 타입의 데이터를 표시할 수 있다.
  • 리사이클러뷰의 아이템을 접을 수 있다.

구조

이전에 구현했던 어댑터는 어댑터 클래스 내부에서 사용자에게 보여지는 그릇에 해당하는 ViewHolder, 그리고 음식에 해당하는 Data를 모두 관리한다.

모델과 뷰를 분리하는 패턴의 관점에서보면 어댑터가 너무 많은 기능을 담당하고 있어서 비대해지는 것이라고 볼 수 있다.

그래서 Adapter는 기존 ViewHolder를 생성하고 데이터를 생성된 ViewHolder에 담는 역할을 수행하는 것으로 역할을 제한시키고,

데이터를 관리할 수 있는 Section이라는 개념을 추가한다.

Section은 어댑터가 데이터를 다루기 위해 사용하는 클래스이다.

  • ItemSection은 하나의 데이터를 담는 섹션 타입이다.
  • ListSection은 리스트 데이터를 담는 섹션 타입이다.
  • 파란 점선인 NestedSection, HeaderSection은 내부에 자식 Section들을 가지는 Section들이다.
  • 위의 두 섹션들은 단독으로는 기능을 하지 못하며 하위 섹션 구조를 만들 때 사용한다.

NestedSection

public class NestedSection extends Section {
	// 하위에 다른 섹션들을 가지며 이를 관리한다.
    final List<Section> sections = new ArrayList<>();


}

어댑터는 다른 섹션들을 추가할 수 있는 NestedSection 인스턴스를 가지고 있다.

이제 어댑터는 NestedSection을 가지고 데이터를 관리하게 된다.

위 그림의 예제와 같이 다양한 형태의 하위 섹션으로 데이터를 담을 수 있게 된다.

HeaderSection

public class HeaderSection<H> extends NestedSection {
	// ItemSection - 싱글 아이템으로서 Header를 담당한다.
    // 클릭 시 아래의 NestedSection을 숨길 수 있다.
    private final ItemSection<H> itemSection;
    // NestedSection - 위 헤더아래에 담길 하위 내용을 담는 섹션이다.
    private final NestedSedction nestedSection;

}

HeaderSection은 NestedSection을 상속하는 클래스이다.
헤더의 역할을 할 하나의 ItemSection을 가지고, 내용을 가질 NestedSection을 가지고 있다.

헤더 섹션의 주기능은 헤더를 클릭하면 헤더 섹션의 내용을 접을 수 있는 기능이다.

사용하기

TaskFragment.java

// 헤더섹션 생성
HeaderSection<Header> headerSection = new HeaderSection(headerItem);

// 하위 내용에 삽입될 리스트 섹션 생성
ListSection<Task> listSection = new ListSection<>();
listSection.addAll(taskList);

// 헤더에 생성한 리스트 섹션을 추가
headerSection.addSection(listSection);

// 어댑터의 루트 nestedSection에 헤더섹션을 추가
adapter.addSection(headerSection);

이제 어댑터 내부에서 Data를 관리하지 않고 다른 곳에서 섹션으로 감싼 데이터 구성을 마친 후
어댑터에게 추가하기만하면 어댑터는 리사이클러뷰에 등록된 데이터를 표현할 수 있다.

실행예제

실행예제의 섹션구조

 

리사이클러뷰 아이템 접기

 

'Android' 카테고리의 다른 글

Toolbar에 메뉴 추가하기  (0) 2021.12.01
Android Abstraction Between Packages  (0) 2021.10.27
(Part.1) 리사이클러뷰에서 여러 타입의 데이터 사용하기  (0) 2020.04.13
Dagger setup with WorkManager  (0) 2019.12.13
WorkManager  (0) 2019.12.12