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:
package br.com.viasoft.agromonitor.ui.components;
import android.app.Activity;
import android.widget.Button;
import android.widget.TextView;
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;
import br.com.viasoft.agromonitor.dialog.DialogSimpleFilterSelect;
@EActivity(R.layout.activity_armadilha)
public class LayoutTesteList extends Activity {
@ViewById
Button btnOpenDialog;
@ViewById
TextView textItemSelecionado;
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;
}
@Override
public String toString() {
return id.toString().concat(" - ").concat(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;
});
DialogSimpleFilterSelect<TesteItem> dialog = new DialogSimpleFilterSelect<>(this, adapter);
dialog.setTitulo("Dialog");
dialog.setHintPesquisa("Pesquisar");
dialog.setTextButtonRemove("Remover item");
dialog.setOnPesquisar(filter -> {
//Filtrar a lista, com base no filter
List<TesteItem> testesFiltrado = new ArrayList<>();
for (TesteItem teste: testes) {
if (teste.toString().toUpperCase().contains(filter.toUpperCase()))
testesFiltrado.add(teste);
}
return testesFiltrado;
});
dialog.setOnItemClick(item -> textItemSelecionado.setText(item.getDescricao()));
btnOpenDialog.setOnClickListener(v -> dialog.show());
}
}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:
package br.com.viasoft.agromonitor.ui.components;
import android.app.Activity;
import android.widget.TextView;
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
EditTextDialogFilterSelect<TesteItem> editTeste;
@ViewById
TextView textItemSelecionado;
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;
}
@Override
public String toString() {
return id.toString().concat(" - ").concat(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;
});
editTeste.setAdapter(adapter)
.setTituloDialog("Titulo dialog")
.setHintDialog("Pesquisar")
.setTextButtonRemoveDialog("Remover")
.setOnClickItem(item -> textItemSelecionado.setText(item.getDescricao()))
.setOnPesquisar(filter -> {
List<TesteItem> testesFiltrado = new ArrayList<>();
for (TesteItem teste: testes) {
if (teste.toString().toUpperCase().contains(filter.toUpperCase()))
testesFiltrado.add(teste);
}
return testesFiltrado;
});
}
}