> For the complete documentation index, see [llms.txt](https://developer.aliothx.net/start/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developer.aliothx.net/start/uiux/ui-ux/listview.md).

# 리스트뷰 (ListView)

## 기본 리스트 뷰

<figure><img src="/files/71sDp1CNJqj9hGDYJ1JM" alt=""><figcaption></figcaption></figure>

***`ListView.builder`***&#xB294; 아이템의 개수와 아이템을 동적으로 생성하는 함수를 제공합니다. 이를 통해 메모리 효율적으로 큰 목록을 처리할 수 있습니다.&#x20;

```dart
ListView.builder(
  controller: controller, // 스크롤 컨트롤러
  itemCount: 15, // 아이템 개수
  itemBuilder: (context, index) { // 아이템 생성 함수
    return Card(
      margin: EdgeInsets.all(15),
      elevation: 3,
      child: ListTile(
        contentPadding: EdgeInsets.all(50),
        title: Text(items[index]),
      ),
    );
  },
);
```

* ***`controller`***: 스크롤을 제어하는 데 사용되는 ***`ScrollController`***&#xB97C; 지정할 수 있습니다.
* ***`itemCount`***: 목록에 표시할 아이템의 총 개수를 지정합니다.
* ***`itemBuilder`***: 아이템을 생성하는 함수로, 인덱스별로 호출되며 해당 인덱스에 표시할 위젯을 반환합니다.

위의 코드에서는 15개의 아이템을 가진 ***`ListView.builder`***&#xB97C; 생성하고 있으며, 각 아이템은 ***`Card`***&#xC640; ***`ListTile`***&#xC744; 포함하는 형태로 구성됩니다. ***`items`***&#xB77C;는 문자열 목록을 사용하여 간단한 리스트를 생성하고 있습니다.

## 무한 스크롤 리스트뷰

<figure><img src="/files/AgL6FXTusVb09ooZYn38" alt=""><figcaption></figcaption></figure>

무한 스크롤 리스트뷰는 사용자가 스크롤을 끝까지 내릴 때마다 자동으로 추가 데이터를 로드하여 리스트를 확장하는 기능을 제공하는 위젯입니다. 이를 위해 ListView\.builder를 사용하고, 스크롤 위치가 일정 지점에 도달하면 새로운 아이템을 불러오는 방식으로 구현할 수 있습니다.

```dart
ListView.builder(
            itemBuilder: (BuildContext context, int i) {
              return Card(
                elevation: 3,
                child: ListTile(
                  title: Text("List Item"),
                ),
              );
            },
          );
```

위의 코드는 무한 스크롤 리스트뷰를 구현한 예제입니다. 사용자가 리스트의 끝까지 스크롤하면 새로운 아이템을 자동으로 로드하고, 로딩 중에는 로딩 인디케이터를 표시합니다. 이 코드를 참고하여 필요한 데이터를 로드하는 방식으로 무한 스크롤 리스트뷰를 만들 수 있습니다.

## 리스트뷰 슬라이드&#x20;

<figure><img src="/files/vI6IfwV0tsd4BsAesFQy" alt=""><figcaption></figcaption></figure>

Flutter 앱에서 리스트 항목을 슬라이드하여 추가 작업을 수행하는 기능은 사용자 경험을 향상시키는 데 유용한 기능 중 하나입니다. 이를 위해 ***`flutter_slidable`*** 패키지를 사용하여 리스트뷰 슬라이딩을 구현할 수 있습니다.

***`flutter_slidable`*****&#x20;패키지란?**

***`flutter_slidable`*** 패키지는 Flutter 앱에서 슬라이드 가능한 항목을 구현하는 데 도움을 주는 패키지입니다. 이 패키지를 사용하면 사용자가 항목을 좌우로 슬라이드하여 추가 작업을 수행할 수 있습니다. 이 패키지를 사용하면 아래와 같은 작업을 할 수 있습니다.

* 아이템 슬라이드 시 주요 작업과 보조 작업 정의
* 아이템 삭제 또는 아카이브와 같은 작업 확인 기능 제공
* 사용자에게 알림 메시지 표시

**예제 코드 설명**

주어진 코드 예제에서는 ***`flutter_slidable`*** 패키지를 사용하여 리스트뷰 슬라이딩을 구현하고 있습니다. 예제에서 사용하는 주요 구성 요소는 다음과 같습니다.

* ***`Slidable`***: 리스트 항목을 둘러싸는 위젯으로, 슬라이딩 작업을 설정할 수 있습니다. 각 ***`Slidable`***&#xC740; 시작 및 끝 작업 패널을 가질 수 있습니다.
* 시작 및 끝 작업 패널: 각 패널에는 슬라이딩 동작과 관련된 작업을 정의합니다. 주요 작업 및 보조 작업을 설정할 수 있으며, 아이콘 및 레이블을 표시할 수 있습니다.
* ***`DismissiblePane`***: 항목을 삭제하거나 아카이브하는 동작을 수행하는 패널입니다. 이 패널은 ***`confirmDismiss`*** 함수를 통해 사용자에게 동작 확인을 요청합니다.

**액션 패널 및 작업 설정**

각 ***`Slidabl`***`e` 위젯은 시작 및 끝 작업 패널을 가지며, 패널에는 슬라이딩으로 실행할 작업이 포함됩니다. 예제에서는 "Archive" 및 "Share"와 같은 주요 작업 및 "More" 및 "Delete"와 같은 보조 작업을 설정하고 있습니다.

```dart
final mainActions = <Widget>[
  SlidableAction(
    label: 'Archive',
    foregroundColor: Colors.blue,
    icon: Icons.archive,
    onPressed: (_) => _showSnackBar('Archive'),
  ),
  // ...
];

final secondaryActions = <Widget>[
  SlidableAction(
    label: 'More',
    foregroundColor: Colors.black45,
    icon: Icons.more_horiz,
    onPressed: (_) => _showSnackBar('More'),
  ),
  // ...
];
```

**슬라이딩 항목 구성**

각 슬라이딩 항목은 ***`Slidable`*** 위젯을 통해 구성됩니다. ***`Slidable`*** 위젯은 시작 및 끝 작업 패널을 정의하고, 이 패널에 작업을 할당합니다.

```dart
Slidable(
  key: ValueKey(entry.key),
  startActionPane: ActionPane(
    motion: entry.value,
    extentRatio: 0.2,
    children: mainActions,
  ),
  endActionPane: ActionPane(
    motion: entry.value,
    extentRatio: 0.2,
    children: secondaryActions,
  ),
  child: ListTile(
    // ...
  ),
)
```

**슬라이딩 항목 삭제 기능**

슬라이딩 항목 중 하나는 삭제할 수 있는 기능을 제공합니다. 이를 위해 ***`DismissiblePane`***&#xB97C; 사용하여 아이템을 삭제할 수 있도록 설정하고, ***`confirmDismiss`***&#xB97C; 통해 삭제 전 확인 다이얼로그를 표시합니다.

```dart
final dismissal = DismissiblePane(
  onDismissed: () {
    _showSnackBar('Dismiss Archive');
    setState(() => this._items.removeAt(_items.length - 1));
  },
  confirmDismiss: () async {
    final bool? ret = await showDialog<bool>(
      context: context,
      builder: (context) {
        return AlertDialog(
          // ...
        );
      },
    );
    return ret ?? false;
  },
);
```

Flutter 앱에서 ***`flutter_slidable`*** 패키지를 사용하여 리스트뷰 슬라이딩을 구현하는 방법에 대한 설명을 참고하여, 이를 활용한 사용자 친화적인 UI를 만들어보세요.

## 그리드뷰(GridView)

리스트뷰와 마찬가지로 Flutter에서 데이터 목록을 표시하고 스크롤하는 데 사용되는 위젯입니다. \
주로 사진 갤러리등에 사용됩니다.

<figure><img src="/files/qx3B9xG1GnWk6VUW75Mg" alt=""><figcaption></figcaption></figure>

```dart
GridView.builder(
          controller: controller,
          itemCount: 15,
          itemBuilder: (context, index) {
            return Card(
              margin: EdgeInsets.all(20),
              elevation: 3,
              child: ListTile(
                contentPadding: EdgeInsets.all(20),
                title: Text(items[index]),
              ),
            );
          },
          scrollDirection: scrollDirection,
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 2, childAspectRatio: 1, crossAxisSpacing: 10),
        )
```

* ***`itemBuilder`***: 아이템을 생성하는 함수로, 인덱스별로 호출되며 해당 인덱스에 표시할 위젯을 반환합니다.
* ***`itemCount`***: 목록에 표시할 아이템의 총 개수를 지정합니다.
* ***`controller`***: 스크롤을 제어하는 데 사용되는 ***`ScrollController`***&#xB97C; 지정할 수 있습니다.

<br>
