목표
- 하나의 어댑터에서 여러가지 타입의 데이터를 표시할 수 있다.
- 리사이클러뷰의 아이템을 접을 수 있다.
구조
이전에 구현했던 어댑터는 어댑터 클래스 내부에서 사용자에게 보여지는 그릇에 해당하는 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 |