Classe: BaseViewHolder (abstrata)

Esta classe é responsável para que suas filhas armazenem informações da view que serão montadas pelos adapter (ListAdapter), como: EditText, ImageView, Button, entre outros componentes;

constructor BaseViewHolder(View view):

Nesse construtor base, recebe a view que será criada, e a mesma é vinculada a BaseViewHolder, após isso serão disparados os métodos: onCreateComponents (responsável para que as filhas criem seus devidos componentes), onCreatEvents (associa os eventos de cada componente);

função protected abstract void onCreateComponents():

Função que deve ser implementada nas classes filhas, para criar os componentes da view;

função protected abstract void onCreateComponents():

Função que deve ser implementada nas classes filhas, para vincular eventos aos componentes da view após os mesmos serem criados pelo onCreateComponents();

função public View getView():

Função responsável por retornar a view vinculada a classe quando a mesma foi construida;

função public static <T extends BaseViewHolder> T getOrNewViewHolder(View view, Class<T> tClass):

Essa função deve ser tipada como um BaseViewHolder, para retornar uma instancia de um BaseViewHolder;

Pela view passada por parâmetro irá verificar se há algum objeto associado ao método getTag(), se houver, retorna esse mesmo objeto;

Se não houver, através do parâmetro tClass, é criado uma instância do tipo definido no método, essa instancia é criada usando reflection, com base no construtor padrão da classe BaseViewHolder;

Exemplo:

1package br.com.viasoft.agromonitor.ViewHolder; 2 3import android.view.View; 4import android.widget.Button; 5import android.widget.TextView; 6 7import br.com.viasoft.agromonitor.R; 8 9public class TesteViewHolder extends BaseViewHolder{ 10 private TextView textView; 11 private Button button; 12 13 //Construtor padrão 14 public TesteViewHolder(View view) { 15 super(view); 16 } 17 18 //Cria componentes 19 @Override 20 protected void onCreateComponents() { 21 button = getView().findViewById(R.id.buttonClear); 22 textView = getView().findViewById(R.id.text); 23 } 24 25 //Vincula eventos aos componentes 26 @Override 27 protected void onCreateEvents() { 28 button.setOnClickListener(v -> textView.setText("Clicou")); 29 } 30}

Inteface: OnConstructorViewHolder<T>

Essa interface tem como função de notificar a construção de um BaseViewHolder, quando o mesmo for delegado por um ListAdapter;

função BaseViewHolder onContructor(T item, View view):

Esse método é responsável por criar a BaseViewHolder que será usado para construir a view do ListAdapter;

O parâmetro item, é o item (dados) que será usado para construir a view com dados da ListAdapter;

O parâmetro view, é a view que será utilizada para criar uma instancia de um BaseViewHolder;

Após o BaseViewHolder ser construído e alimentado o o mesmo deve ser retornado, para que a view seja desenhada;

Aconselha-se que quando criar uma instancia de um BaseViewHolder usando esse evento, use o método estatico getOrNewViewHolder da classe BaseViewHolder, para criar um novo ou retornar um ja assosiado a view da vez. Exemplo:

1MeuViewHolder viewHolder = MeuViewHolder.getOrNewViewHolder(view, MeuViewHolder.class);

Classe: BaseListAdapter<T>

Essa classe extende de BaseAdapter, e a mesma deve ser tipada;

contructor BaseListAdapter(Integer layoutItem, Context context, OnConstructorViewHolder<T> onConstructorViewHolder):

Parâmetro layoutItem, é o layout da view que será desnhada para cada item;

Parâmetro context, é o contexto atual;

Parâmetro onContructorViewHolder, esse é o evento que é delegado para a view criar o BaseViewHolder e retornar o mesmo para gerar o layout do item;

contructor BaseListAdapter(Integer layoutItem, Context context, List<T> list, OnConstructorViewHolder<T> onConstructorViewHolder):

Parâmetro layoutItem, é o layout da view que será desnhada para cada item;

Parâmetro context, é o contexto atual;

Parâmetro list, é o conjunto de dados inicial;

Parâmetro onContructorViewHolder, esse é o evento que é delegado para a view criar o BaseViewHolder e retornar o mesmo para gerar o layout do item;

função void refreshList(List<T> list):

Essa função atualiza o conjunto de dados, e após atualizar, notifica a todos os membros que utilizam esse adapter, os mesmo são redesenhados a partir do novo conjunto de dados;

Exemplo de como instanciar:

1package br.com.viasoft.agromonitor.ui.components; 2 3import android.app.Activity; 4import android.widget.ListView; 5 6import org.androidannotations.annotations.AfterViews; 7import org.androidannotations.annotations.EActivity; 8import org.androidannotations.annotations.ViewById; 9 10import java.util.ArrayList; 11import java.util.List; 12 13import br.com.viasoft.agromonitor.R; 14import br.com.viasoft.agromonitor.ViewHolder.TesteExmploViewHolder; 15import br.com.viasoft.agromonitor.adapter.BaseListAdapter; 16 17@EActivity(R.layout.activity_armadilha) 18public class LayoutTesteList extends Activity { 19 @ViewById 20 ListView listExemplo; 21 22 class TesteItem { 23 private Integer id; 24 private String descricao; 25 26 public TesteItem(Integer id, String descricao) { 27 this.id = id; 28 this.descricao = descricao; 29 } 30 31 public Integer getId() { 32 return id; 33 } 34 35 public void setId(Integer id) { 36 this.id = id; 37 } 38 39 public String getDescricao() { 40 return descricao; 41 } 42 43 public void setDescricao(String descricao) { 44 this.descricao = descricao; 45 } 46 } 47 48 @AfterViews 49 public void init() { 50 List<TesteItem> testes = new ArrayList<>(); 51 52 testes.add(new TesteItem(1, "Teste 1")); 53 testes.add(new TesteItem(2, "Teste 2")); 54 55 BaseListAdapter<TesteItem> adapter = new BaseListAdapter<>(R.layout.layout_exemplo_item, this, testes, 56 (item, view) -> { 57 TesteExmploViewHolder viewHolder = TesteExmploViewHolder.getOrNewViewHolder(view, TesteExmploViewHolder.class); 58 59 viewHolder.getTextDescricao().setText(item.getDescricao()); 60 viewHolder.getTextId().setText(item.getId().toString()); 61 62 return viewHolder; 63 }); 64 65 listExemplo.setAdapter(adapter); 66 67 testes.add(new TesteItem(3, "Teste 3")); 68 69 adapter.refreshList(testes); 70 } 71}

Interface: OnItemClick<T>

Essa interface tem como objetivo de ser um evento, para quando um item for clicado na dialog, o mesmo seja transferido para a view;

função void onClick(T item):

Passa o item selecionado através do parâmetro item, do dialog para a view;

Interface: OnPesquisar<T>

Essa interface tem como objetivo de ser um evento, para quando uma string for digitada pelo EditText de pesquisa na dialog, o mesmo seja transferido para a view, para a view filtrar ou procurar novos registros com base no filtro, e retornando a nova lista para dialog exibir os novos dados;

função List<T> onPesquisar(String filter):

Passa o filtro digitado através do parâmetro filter, do dialog para a view, delegando a responsabilidade de montar uma nova lista, e retornando para a dialog exibir os novos dados;

Classe: DialogSimpleFilterSelect<T>

Esse classe é responsável por construir o dialog, com os os dados que serão filtrado e possivelmente selecionados. Nesse dialog tem um EditText, onde é para realizar o filtro (esse processo utiliza o método toString() da classe tipada para o dialog), um botão que limpa o EditText, e um botão para remover o item que foi selecionado no dialog, esse botão só fica visível caso algum item tenha sido selecionado;

construtor DialogSimpleFilterSelect(Context context, BaseListAdapter<T> adapter):

Parametro context, o contexto atual;

Parametro adapter, esse adapter deve ser passado para exibir a lista em tela para o usuário;

função T getItemSelect():

Retorna o item selecionado na ListView do dialog;

função void setOnClickItem(OnItemClick<T> onItemClick)

Associa o evento para quando o item da ListView da dialog ser clicado, o mesmo ser enviado para a view;

função void setOnPesquisar(OnPesquisar<T> onPesquisar):

Associa o evento para quando os dígitos do EditText da dialog estiverem sendo inseridos, dispara esse evento, passando o texto do EditText como parâmetro, delegando para a view filtrar ou gerar uma nova lista e retornar a mesma;

função void clearItemSelected():

Limpa o item selecionado, dando uma referencia nula ao item;

função void setItemSelect(T item):

Adiciona um item como selecionado na dialog;

função void setTitulo(String titulo):

Define o titulo da dialog;

função void setHintPesquisa(String hint):

Define o hint do EditText de pesquisa da dialog;

função void setTextButtonRemove(String text):

Define o texto do botão de remover o item selecionado;

Exemplo:

1package br.com.viasoft.agromonitor.ui.components; 2 3import android.app.Activity; 4import android.widget.Button; 5import android.widget.TextView; 6 7import org.androidannotations.annotations.AfterViews; 8import org.androidannotations.annotations.EActivity; 9import org.androidannotations.annotations.ViewById; 10 11import java.util.ArrayList; 12import java.util.List; 13 14import br.com.viasoft.agromonitor.R; 15import br.com.viasoft.agromonitor.ViewHolder.TesteExmploViewHolder; 16import br.com.viasoft.agromonitor.adapter.BaseListAdapter; 17import br.com.viasoft.agromonitor.dialog.DialogSimpleFilterSelect; 18 19@EActivity(R.layout.activity_armadilha) 20public class LayoutTesteList extends Activity { 21 @ViewById 22 Button btnOpenDialog; 23 @ViewById 24 TextView textItemSelecionado; 25 26 class TesteItem { 27 private Integer id; 28 private String descricao; 29 30 public TesteItem(Integer id, String descricao) { 31 this.id = id; 32 this.descricao = descricao; 33 } 34 35 public Integer getId() { 36 return id; 37 } 38 39 public void setId(Integer id) { 40 this.id = id; 41 } 42 43 public String getDescricao() { 44 return descricao; 45 } 46 47 public void setDescricao(String descricao) { 48 this.descricao = descricao; 49 } 50 51 @Override 52 public String toString() { 53 return id.toString().concat(" - ").concat(descricao); 54 } 55 } 56 57 @AfterViews 58 public void init() { 59 List<TesteItem> testes = new ArrayList<>(); 60 61 testes.add(new TesteItem(1, "Teste 1")); 62 testes.add(new TesteItem(2, "Teste 2")); 63 64 BaseListAdapter<TesteItem> adapter = new BaseListAdapter<>(R.layout.layout_exemplo_item, this, testes, 65 (item, view) -> { 66 TesteExmploViewHolder viewHolder = TesteExmploViewHolder.getOrNewViewHolder(view, TesteExmploViewHolder.class); 67 68 viewHolder.getTextDescricao().setText(item.getDescricao()); 69 viewHolder.getTextId().setText(item.getId().toString()); 70 71 return viewHolder; 72 }); 73 74 DialogSimpleFilterSelect<TesteItem> dialog = new DialogSimpleFilterSelect<>(this, adapter); 75 76 dialog.setTitulo("Dialog"); 77 dialog.setHintPesquisa("Pesquisar"); 78 dialog.setTextButtonRemove("Remover item"); 79 80 dialog.setOnPesquisar(filter -> { 81 //Filtrar a lista, com base no filter 82 List<TesteItem> testesFiltrado = new ArrayList<>(); 83 84 for (TesteItem teste: testes) { 85 if (teste.toString().toUpperCase().contains(filter.toUpperCase())) 86 testesFiltrado.add(teste); 87 } 88 89 return testesFiltrado; 90 }); 91 92 dialog.setOnItemClick(item -> textItemSelecionado.setText(item.getDescricao())); 93 94 btnOpenDialog.setOnClickListener(v -> dialog.show()); 95 } 96}

Classe: EditTextDialogFilterSelect<T>

Essa classe denha um EditText personalizado que encapsula o DialogSimpleFilterSelect<T> para criar EditTexts personalizados de seleção. Sempre que houver um clique no EditText, abre o dialog, e sempre que selecionar um item passa o toString() do item selecionado para o setText() do EditTextFilterSelect<T>;

função T getSelectedItem():

Delega a chamada do método getItemSelect() do DialogSimpleFilterSelect<T>;

função EditTextDialogFilterSelect<T> setOnPesquisar(OnPesquisar<T> onPesquisar):

Delega o evento onPesquisar para o DialogSimpleFilterSelect<T>;

função EditTextDialogFilterSelect<T> setOnClickItem(OnItemClick<T> onItemClick):

Delega o evento onItemClick para o DialogSimpleFilterSelect<T>;

função EditTextDialogFilterSelect<T> setHintDialog(String hint):

Delega define o hint do EditText do DialogSimpleFilterSelect<T>;

função EditTextDialogFilterSelect<T> setTituloDialog(String titulo):

Delega define o titulo do DialogSimpleFilterSelect<T>;

função EditTextDialogFilterSelect<T> setAdapter(BaseListAdapter<T> adapter):

Delega define o adapter da ListView do DialogSimpleFilterSelect<T>;

função EditTextDialogFilterSelect<T> setTextButtonRemoveDialog(String text):

Delega define o texto do botão de remover item selecionado do DialogSimpleFilterSelect<T>;

função void clear():

Chama a função clearItemSelected() do DialogSimpleFilterSelect<T> e limpa o EditText;

Exemplo:

1package br.com.viasoft.agromonitor.ui.components; 2 3import android.app.Activity; 4import android.widget.TextView; 5 6import org.androidannotations.annotations.AfterViews; 7import org.androidannotations.annotations.EActivity; 8import org.androidannotations.annotations.ViewById; 9 10import java.util.ArrayList; 11import java.util.List; 12 13import br.com.viasoft.agromonitor.R; 14import br.com.viasoft.agromonitor.ViewHolder.TesteExmploViewHolder; 15import br.com.viasoft.agromonitor.adapter.BaseListAdapter; 16 17@EActivity(R.layout.activity_armadilha) 18public class LayoutTesteList extends Activity { 19 @ViewById 20 EditTextDialogFilterSelect<TesteItem> editTeste; 21 @ViewById 22 TextView textItemSelecionado; 23 24 class TesteItem { 25 private Integer id; 26 private String descricao; 27 28 public TesteItem(Integer id, String descricao) { 29 this.id = id; 30 this.descricao = descricao; 31 } 32 33 public Integer getId() { 34 return id; 35 } 36 37 public void setId(Integer id) { 38 this.id = id; 39 } 40 41 public String getDescricao() { 42 return descricao; 43 } 44 45 public void setDescricao(String descricao) { 46 this.descricao = descricao; 47 } 48 49 @Override 50 public String toString() { 51 return id.toString().concat(" - ").concat(descricao); 52 } 53 } 54 55 @AfterViews 56 public void init() { 57 List<TesteItem> testes = new ArrayList<>(); 58 59 testes.add(new TesteItem(1, "Teste 1")); 60 testes.add(new TesteItem(2, "Teste 2")); 61 62 BaseListAdapter<TesteItem> adapter = new BaseListAdapter<>(R.layout.layout_exemplo_item, this, testes, 63 (item, view) -> { 64 TesteExmploViewHolder viewHolder = TesteExmploViewHolder.getOrNewViewHolder(view, TesteExmploViewHolder.class); 65 66 viewHolder.getTextDescricao().setText(item.getDescricao()); 67 viewHolder.getTextId().setText(item.getId().toString()); 68 69 return viewHolder; 70 }); 71 72 editTeste.setAdapter(adapter) 73 .setTituloDialog("Titulo dialog") 74 .setHintDialog("Pesquisar") 75 .setTextButtonRemoveDialog("Remover") 76 .setOnClickItem(item -> textItemSelecionado.setText(item.getDescricao())) 77 .setOnPesquisar(filter -> { 78 List<TesteItem> testesFiltrado = new ArrayList<>(); 79 80 for (TesteItem teste: testes) { 81 if (teste.toString().toUpperCase().contains(filter.toUpperCase())) 82 testesFiltrado.add(teste); 83 } 84 85 return testesFiltrado; 86 }); 87 } 88}