Esse post estava no rascunho a algum tempo e resolvi publica-lo finalmente :) Vou mostrar como utilizar a lista agrupada do Android, a ExpandableListView. Como o próprio nome diz, ela contém uma lista de elementos que ao serem clicados exibem uma sublista. Como exemplo, teremos uma lista de estados, e ao clicar no nome do estado, exibiremos suas respectivas cidades.
Abaixo temos o código da Activity da aplicação.
public class ExemploExpladableListViewActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView( R.layout.activity_exemplo_expladable_list_view); ExpandableListView listview =(ExpandableListView) findViewById(R.id.expandableListView1); List<String> listPe = new ArrayList<String>(); listPe.add("Caruaru"); listPe.add("Recife"); List<String> listSp = new ArrayList<String>(); listSp.add("São Paulo"); listSp.add("Campinas"); Map<String, List<String>> dados = new HashMap<String, List<String>>(); dados.put("PE", listPe); dados.put("SP", listSp); listview.setAdapter( new MeuExpadableAdapter(dados)); } }
Como podemos notar, ao invés de usar uma lista simples, utilizamos um HashMap onde cada elemento será composto de uma chave que será o nome do estado e o valor será uma lista com as cidade daquele estado. O arquivo de layout contém apenas uma ExpandableListView, conforme abaixo.
<ExpandableListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/expandableListView1" android:layout_width="match_parent" android:layout_height="match_parent" />
Como uma ListView comum, utilizaremos um Adapter para exibir o conteúdo da lista. A diferença é que herdaremos de BaseExpandableListAdapter, onde teremos que implementar mais alguns métodos além dos que já estamos acostumados nas listas convencionais:
- getGroup: retorna o objeto que representa o grupo de informações. No nosso caso, a sigla do estado;
- getGroupCount: retorna quantos grupos nós teremos. Aqui estamos retornando quantas entradas (chaves) temos na nossa HashMap;
- getGroupId: algum inteiro que sirva de identificador único para o grupo, aqui estamos retornando a posição do grupo;
- getGroupView: retorna a View que representará visualmente o grupo na lista;
- getChild: similar ao getItem do Adapter convencional, a diferença é que é passado o índice do grupo e do elemento que se deve retornar;
- getChildId: identificador único do elemento do grupo;
- getChildView: retorna a View que representará o elemento dentro do grupo. Similar ao getView do adapter convencional;
- getChildrenCount: retorna a quantidade de elementos dentro de um grupo;
- hasStableIds: informa se os identificadores dos grupos e dos elementos são fixos;
- isChildSelectable: retorna true se os elementos filhos podem ser selecionados, ou false caso contrário.
class MeuExpadableAdapter extends BaseExpandableListAdapter { private Map<String, List<String>> dados; private List<String> keys; public MeuExpadableAdapter( Map<String, List<String>> dados){ this.dados = dados; this.keys = new ArrayList<String>( dados.keySet()); } @Override public Object getGroup(int groupPosition) { return keys.get(groupPosition); } @Override public int getGroupCount() { return dados.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { View v = LayoutInflater.from( parent.getContext()).inflate( android.R.layout.simple_expandable_list_item_1, null); TextView txt = (TextView) v.findViewById(android.R.id.text1); txt.setText(keys.get(groupPosition)); return v; } @Override public Object getChild( int groupPosition, int childPosition) { return dados.get( keys.get(groupPosition)).get(childPosition); } @Override public long getChildId( int groupPosition, int childPosition) { return 0; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { View v = LayoutInflater.from( parent.getContext()).inflate( android.R.layout.simple_list_item_1, null); TextView txt = (TextView) v.findViewById(android.R.id.text1); txt.setText(dados.get( keys.get(groupPosition)).get(childPosition)); return v; } @Override public int getChildrenCount(int groupPosition) { return dados.get(keys.get(groupPosition)).size(); } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable( int groupPosition, int childPosition) { return true; } }
O exemplo acima (com uma leve modificação :) está aqui.
Qualquer dúvida deixem seus comentários.
4br4ç05,
nglauber