sábado, 17 de maio de 2008

Usando StringItem para fazer listagens.

Ola pessoal,

Algumas vezes queremos fazer algumas listagens em nossos Forms, ou mesclar conteúdo e permitir uma navegação pelos itens e a sua seleção e o uso da lista compromete a usabilidade ou simplesmente não funciona!
Por exemplo, aqueles que já tiveram a oportunidade de usar o JustJava mobile no ano passado (com a grade horária) ou já deu uma olhada no CoSMo (que "nasceu" do JustJava Mobile), viram que na listagem das palestras do dia é possível clicar em uma determinada palestra e ver o detalhe dessa palestra, como nas figura abaixo:

O problema nesse caso é que os nomes dos locais e o título das palestras poderia ser grande, e como eu não confio muito no comportamento do List em diferentes dispositivos, a solução intuitiva era usar StringItem !!
Mas ai eu tinha um problema: Como "descobrir" em qual palestra o usuário clicou para exibir o detalhe corretamente?
No List (ou ChoiceGroup) seria fácil, já que eu tenho o indice selecionado. Então, o mais fácil era ter um indice próprio para que eu pudesse recuperar o registro certo no RMS, nesse caso o próprio ID no RMS.

Criando um novo "StringItem"
Bom, nesse caso então a minha idéia foi criar um novo componente que extendia de um StringItem, portanto eu tinha todo o comportamento já conhecido, e adicionar um atributo de código "escondido", para poder armazenar o ID e depois usar. E a nova classe que criei ficou assim:


public class HiddenIdStringItem extends StringItem {
private int hiddenId;

public HiddenIdStringItem(String label, String text) {

//Uso normal como se fosse um simples StringItem...
super(label, text);
}

public HiddenIdStringItem(int toHiddenId, String label,
String text) {

//construtor da superclasse
super(label, text);
//salvando o ID que se deseja "esconder"
this.hiddenId = toHiddenId;
}

public HiddenIdStringItem(String label, String text,
int appearanceMode) {

//Uso normal como se fosse um simples StringItem...
super(label, text, appearanceMode);
}

public int getHiddenId() {
return hiddenId;
}

public void setHiddenId(int sessionId) {
this.hiddenId = sessionId;
}
}


Como habilitar o click?
Para que o usuário possa clicar no seu novo componente, basta você usar o método setDefaultCommand (no seu item do tipo HiddenIdStringItem), passando como parâmetro algum comando e depois o método setItemCommandListener (também no seu item), passando a instância de uma classe que implementa a interface ItemCommandListener, para que alguém "trate" esse comando que você adicionou.
A classe que implementa a interface, deverá então implementar o método commandAction que recebe o comando associado ao seu item e qual item que se trata. No nosso caso, um item do tipo HiddenIdStringItem. Então, você faz o cast adequado (de item para HiddenIdStringItem) e pode utilizar o método getHiddenId para obter o id que você associou quando criou o componente.

Vantagens
  • Utilizando esse componente você evita problemas com Lists e Choice Groups.
  • Você não precisa ficar comparando o label ou o text para saber qual item é aquele.
  • Ja herda todo o comportamente conhecido do StringItem.
Cuidados:
  • Adicionar o comando e seu listener corretamente.
  • Utilizar os layouts corretamente para não ter surpresas desagradáveis com a exibição dos itens na tela.
Bom pessoal, espero que isso possa ajudar alguém ou que facilite a vida de seus usuários! ;-)

[]s
Neto

Um comentário:

ZeroTrack! disse...

Putz!!! Excelente!! ótima idéia mesmo e eu quebrando cabeça aqui com List... :(