Novo componente EditTextDialogFilterSelect para o Agro Monitor

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:

package br.com.viasoft.agromonitor.ViewHolder; import android.view.View; import android.widget.Button; import android.widget.TextView; import br.com.viasoft.agromonitor.R; public class TesteViewHolder extends BaseViewHolder{ private TextView textView; private Button button; //Construtor padrão public TesteViewHolder(View view) { super(view); } //Cria componentes @Override protected void onCreateComponents() { button = getView().findViewById(R.id.buttonClear); textView = getView().findViewById(R.id.text); } //Vincula eventos aos componentes @Override protected void onCreateEvents() { button.setOnClickListener(v -> textView.setText("Clicou")); } }

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:

MeuViewHolder 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:

package br.com.viasoft.agromonitor.ui.components; import android.app.Activity; import android.widget.ListView; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.ViewById; import java.util.ArrayList; import java.util.List; import br.com.viasoft.agromonitor.R; import br.com.viasoft.agromonitor.ViewHolder.TesteExmploViewHolder; import br.com.viasoft.agromonitor.adapter.BaseListAdapter; @EActivity(R.layout.activity_armadilha) public class LayoutTesteList extends Activity { @ViewById ListView listExemplo; class TesteItem { private Integer id; private String descricao; public TesteItem(Integer id, String descricao) { this.id = id; this.descricao = descricao; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getDescricao() { return descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } } @AfterViews public void init() { List<TesteItem> testes = new ArrayList<>(); testes.add(new TesteItem(1, "Teste 1")); testes.add(new TesteItem(2, "Teste 2")); BaseListAdapter<TesteItem> adapter = new BaseListAdapter<>(R.layout.layout_exemplo_item, this, testes, (item, view) -> { TesteExmploViewHolder viewHolder = TesteExmploViewHolder.getOrNewViewHolder(view, TesteExmploViewHolder.class); viewHolder.getTextDescricao().setText(item.getDescricao()); viewHolder.getTextId().setText(item.getId().toString()); return viewHolder; }); listExemplo.setAdapter(adapter); testes.add(new TesteItem(3, "Teste 3")); adapter.refreshList(testes); } }

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:

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:

Â