Desenvolvendo uma aplicação JME – Parte II

 

Olá pessoal, vamos dar continuidade à nossa série de artigos sobre desenvolvimento de aplicações móveis em J2ME, as chamadas Midlets. No artigo passado, abordamos alguns componentes da interface gráfica com o usuário, mais especificamente os componentes Alert e TextBox, além de analisarmos a interação entre as aplicações e o usuários através dos Commands. Para os que não tiveram a oportunidade de ler o último artigo, bem como os artigos anteriores, podem acessa-los através dos links presentes ao final desta página.

 

Neste artigo, iremos ver um novo, e extremamente importante, componente da interface gráfica oferecida pelo J2ME: o List. Iremos ver todos os possíveis tipos de listas, analisando seus construtores e modos de interação com o usuário. O List representa o penúltimo componente da chamada Interface Gráfica de Alto Nível que iremos abordar. Tal interface é composta de quatro componentes: Alert, TextBox, List e Form. Os formulários começarão a ser abordados no próximo artigo.

 

Vamos lá então! O componente List (lista, em português) corresponde a um componente bastante amigável e intuitivo que oferece a possibilidade de escolha dentre os diversos itens que são relacionados na lista. Existem três possíveis tipos de listas que podem ser implementadas: Implícita, Exclusiva e Múltipla. Abordaremos cada uma delas, e veremos as suas particularidades.

 

Basicamente, a nossa aplicação possui a seguinte estrutura: uma lista principal (do tipo Implícita), a qual possui duas opções (uma que leva para uma lista Múltipla e outra para uma lista Exclusiva); além disto, existem três comandos (um associado à lista Implícita e serve para sair da aplicação, outro que permite ao usuário retornar à lista Implícita nos casos em que estiver em uma das outras duas listas e, por fim, um comando que permite com que os itens selecionados nas listas múltipla e exclusiva sejam mostrados em um componente do tipo Alert). O objetivo da aplicação é apenas realizar um “switch” entre as diversas telas, cada uma delas sendo constituídas por um tipo de List diferente, e permitir a captura e exibição dos itens selecionados nas listas múltipla e exclusiva; desta maneira, pode-se perceber, na prática, as diferenças e características de cada um dos três possíveis tipos de listas que se pode instanciar.

 

Antes de vermos os comandos que permitem instanciar as listas, veremos as diferenças entre os diferentes tipos de List:

·         Lista Exclusiva: este tipo de List oferece uma lista de itens com uma caixa de “radio” associado a cada um deles; esta modalidade de lista permite com que apenas um único item da lista seja selecionado. Em J2ME, fazemos referência para uma lista Exclusiva através da constante List.EXCLUSIVE.

·         Lista Múltipla: oferece ao usuário a possibilidade de escolher mais de um item dentre os presentes na lista; para cada item representado, é associada uma caixa de marcação (uma espécie de “checkbox”). Em J2ME, podemos criar uma instância de uma lista Múltipla através da constante List.MULTIPLE.

·         Lita Implícita: esta lista é caracterizada por permitir aos usuários selecionar apenas um item entre aqueles listados na lista; a funcionalidade desta lista é bastante parecida com a lista Exclusiva; no entanto, existem diferenças sutis e interessantes: a lista Implícita, ao contrário da lista Exclusiva, na oferece o “radio” ao lado de cada item listado; além disto, as listas implícitas já possuem um comando associado, ou seja, não existe a necessidade de se definir um Command para tratar as entradas do usuário. Em J2ME, este tipo de lista é referenciada através da constante List.IMPLICIT, e o Command a ela associada pode ser acessado através da instrução List.SELECT_COMMAND.

 

Todas as listas instanciadas (com exceção da lista Implícita, conforme mencionado acima) devem possuir um comando associado, o qual é necessário para processar as entradas do usuário.

 

A Figura 01 abaixo apresenta as três primeiras telas da nossa aplicação, as quais representam os três tipos de lista possíveis: Implícita, Exclusiva e Múltipla, respectivamente. Já a Figura 02, apresentada em seguida, representa o Alert responsável por mostrar os itens selecionados na lista Exclusiva ou na lista Múltipla.

 

j2mepart2fig11.JPG

j2mepart2fig12.JPG 

j2mepart2fig13.JPG

Figura 01: Os três tipos de lista existentes.

 

j2mepart2fig2.JPG

Figura 02: Exibição dos itens selecionados.

 

Vamos então entender como é feita a implementação dos diferentes tipos de listas. Deve-se, primeiro, criar um objeto do tipo List, e então instanciá-lo, como mostrado a seguir:

 

List lista = new List(“Título da Lista”, tipo_da_lista, itens_a_serem_listados, imagens_associadas_a cada_item);

 

O tipo da lista pode ser um dos três tipos que vimos, ou seja, Implícita, Exclusiva ou Múltipla, e é representada, no código fonte, pelas constantes List.IMPLICIT, List.EXCLUSIVE e List.MULTIPLE, respectivamente. Os itens a serem listados devem ser informados através de um vetor de String, onde cada elemento do vetor representa um item a ser listado na tela. De forma semelhante, pode-se informar um vetor de imagens que serão exibidas junto aos itens listados; caso não deseje utilizar imagens nos itens da lista, pode-se passar o valor “null” para este parâmetro.

 

Uma vez criadas as listas, temos que definir comandos e associá-los às listas, com o objetivo de poder processar as seleções do usuário e executar ações associadas com as listas. Para determinar qual o item selecionado em uma lista do tipo Exclusiva ou Implícita, podemos utilizar o método “getSelectedIndex()” da lista, o qual retorna um número inteiro representado o índice do item selecionado (ou -1, caso nenhum item tenha sido selecionado). No caso da lista Múltipla, como vários itens podem ser selecionados simultaneamente, temos que utilizar outro artifício para recuperar os itens selecionados; uma das formas de se fazer isto consiste na implementação de um laço de repetição no qual, em cada rodada, é perguntado se um determinado item da lista foi selecionado. Isto é conseguido através da utilização do método “isSelected(int indice)” da lista, que retorna “true” se o item representado pelo índice informado foi selecionado pelo usuário.

 

Atenção: não confunda FÓCU com SELEÇÃO; o fato de o cursor está sobre um determinado item da lista não quer dizer que este item foi selecionado; para que um item seja selecionado, de fato, o usuário deve não somente posicionar o cursor sobre o mesmo, mas também clicar no botão “Select” do simulador, o qual representa uma espécie de tecla “enter” dos dispositivos móveis.

 

Só nos resta agora codificar a nossa aplicação. O código fonte completo da Midlet pode ser observado abaixo.

 

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

 

public class AppList extends MIDlet implements CommandListener {

 

    List listaImplicita;

    List listaExclusiva;

    List listaMultipla;

    Alert itensSelecionados;

    Command sair;

    Command voltar;

    Command exibirItensSelec;

    Display display;

   

    public AppList() {

       

        //Lista Implícita

        String[] itensListaImplicita = {"Lista Exclusiva", "Lista Múltipla"};

        listaImplicita = new List("Lista Implícita", List.IMPLICIT,
                                  itensListaImplicita, null);

       

        //Lista Exclusiva

        String[] itensListaExclusiva = {"Item 1", "Item 2", "Item 3", "Item 4"};

        listaExclusiva = new List("Lista Exclusiva", List.EXCLUSIVE,
                                  itensListaExclusiva, null);

       

        //Lista Múltipla

        String[] itensListaMultipla = {"Item A", "Item B", "Item C"};

        listaMultipla = new List("Lista Múltipla", List.MULTIPLE,
                                 itensListaMultipla, null);

       

        itensSelecionados = new Alert("Itens Selecionados");       

        sair = new Command("Sair", Command.EXIT, 0);

        voltar = new Command("Voltar", Command.BACK, 1);

        exibirItensSelec = new Command("Ver Selecionados", Command.OK, 1);

        listaImplicita.addCommand(sair);

        listaExclusiva.addCommand(voltar);

        listaExclusiva.addCommand(exibirItensSelec);

        listaMultipla.addCommand(voltar);

        listaMultipla.addCommand(exibirItensSelec);

        itensSelecionados.addCommand(voltar);

        listaImplicita.setCommandListener(this);

        listaMultipla.setCommandListener(this);

        listaExclusiva.setCommandListener(this);

        itensSelecionados.setCommandListener(this);

    }

   

    public void startApp() {

        display = Display.getDisplay(this);

        display.setCurrent(listaImplicita);

    }

   

    public void pauseApp() {

    }

   

    public void destroyApp(boolean unconditional) {

        notifyDestroyed();

    }

   

    public void commandAction(Command c, Displayable d) {

        if (c == sair) {

            destroyApp(true);

        }

        else if (c == voltar)

            display.setCurrent(listaImplicita);

        else if (c == List.SELECT_COMMAND) {

            if (listaImplicita.getSelectedIndex() == 0)

                display.setCurrent(listaExclusiva);

            else

                display.setCurrent(listaMultipla);

        }

        else if (c == exibirItensSelec) {

            String item = "";

            if (d == listaExclusiva) {

                item = listaExclusiva.getString(
                                      listaExclusiva.getSelectedIndex());

            }

            else {

                for (int i=0; i