# Como fazer uma lista simples selecionável

> Exibir uma lista de textos e capturar a seleção com ListView (SINGLE ou MULTIPLE).

Source: https://crossfly.dev/pt/docs/cookbook/lists/lista-simples — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Como fazer uma lista simples selecionável

**Propósito.** Mostrar uma lista rolável de itens de texto e reagir quando o usuário
seleciona um (SINGLE) ou vários (MULTIPLE). O `ListView` é um `Component` embutível: você o
adiciona a qualquer layout, sem precisar de janela.

## APIs usadas
- `new ListView(String[] items, ListView.ItemType type)` — cria a lista a partir de um array de textos.
- `new ListView(String title, String[] items, ListView.ItemType type)` — igual, com cabeçalho de título.
- `ListView.ItemType.SINGLE` / `ListView.ItemType.MULTIPLE` — únicos dois valores do enum. `SINGLE` = tap seleciona e dispara `onConfirm`; `MULTIPLE` = checkboxes + botão "Confirmar".
- `ListView.onConfirm(Component.Action action)` — callback disparado ao confirmar. Recebe o próprio `ListView` como fonte do evento.
- `ListView.getSelectedText()` / `getSelectedIndex()` — primeiro item selecionado (texto/índice), ou `null`/`-1`.
- `ListView.getSelectedTexts()` / `getSelectedIndices()` — todos os selecionados (útil em MULTIPLE).
- `ListView.confirmText(String)` — texto do botão de confirmação (default `"Confirmar"`, só em MULTIPLE).

## Exemplo completo (copiar, colar e rodar)
```java
package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;

/** Tela principal executável. Aponte o launcher (classname) e rode: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      String[] frutas = {"Maçã", "Banana", "Laranja", "Uva"};

      // SINGLE: o tap já seleciona e dispara onConfirm
      ListView lista = new ListView("Escolha uma fruta", frutas, ListView.ItemType.SINGLE);
      lista.onConfirm(e ->
      {
         String texto = lista.getSelectedText();   // ex.: "Banana"
         int idx = lista.getSelectedIndex();       // ex.: 1
         Debug.log("Selecionado: " + texto + " (#" + idx + ")");
         return null;
      });
      add(LAY_FILL, lista);   // ListView é um Component: entra direto no layout
   }
}
```

> O trecho abaixo mostra **só o miolo**. Para rodar, coloque-o no esqueleto `MainWindow` acima.

## Trecho mínimo
```java
// verificado na fonte: ListView.java
String[] frutas = {"Maçã", "Banana", "Laranja", "Uva"};

// SINGLE: o tap já seleciona e dispara onConfirm
ListView lista = new ListView("Escolha uma fruta", frutas, ListView.ItemType.SINGLE);
lista.onConfirm(e ->
{
   String texto = lista.getSelectedText();   // ex.: "Banana"
   int idx = lista.getSelectedIndex();       // ex.: 1
   Debug.log("Selecionado: " + texto + " (#" + idx + ")");
   return null;
});
layout.add(.9f, lista);   // ListView é um Component: entra direto no layout
```

```java
// MULTIPLE: checkboxes; onConfirm dispara só ao tocar no botão "Confirmar"
ListView multi = new ListView("Selecione ingredientes", frutas, ListView.ItemType.MULTIPLE);
multi.confirmText("Adicionar");
multi.onConfirm(e ->
{
   String[] escolhidas = multi.getSelectedTexts();   // todos os marcados
   return null;
});
layout.add(.9f, multi);
```

## Aprofunde-se
- Precisa de um popup modal em vez de embutido? Veja [popup-de-selecao.md](/docs/cookbook/lists/popup-de-selecao).
- Milhares de itens? Não use `ListView` (materializa todos); veja [lista-virtual-grande.md](/docs/cookbook/lists/lista-virtual-grande).
- Guia de widget: [ListView](/docs/ui/widgets/listview) · Fonte canônica: Capítulo 15
