O ExpandableListView é um Widget (Componente Visual) muito utilizado em diversos Apps Android mas que é um tanto manhoso para desenvolvedores de primeira viagem.
Se você gostaria de criar um App com uma lista que, ao ser clicada, exibe sub-itens encadeados num acordeão como vemos em centenas de sites na web, este é o componente que você deve utilizar.
Como diversos outros componentes no Android, você deve criar no seu App um Adaptador (classe que vai ser responsável por montar item a item da lista), um layout para o item agrupador (aquele no qual você clica para expandir a lista) e o item de detalhe (aquele que aparece quando você clicar no item agrupador). No nosso exemplo, vamos mostrar uma lista que exibe nomes de programas de TV e os detalhes em seguida.
Crie uma classe chamada ProgramaResumido como a seguir:
public class ProgramaResumido {
public String Titulo;
public String Horario;
public ProgramaResumido(){
}
}
Crie uma classe chamada ProgramaDetalhado como a seguir:
public class ProgramaDetalhado {
public String Titulo;
public String Titulo;
public String Horario;
public boolean Favorito;
public Bitmap Imagem;
public ProgramaDetalhado(){
}
}<span style="color: #141412; font-family: 'Source Sans Pro', Helvetica, sans-serif; font-size: 16px; line-height: 1.5;"> </span>
Crie um layout para o agrupador que nosso Widget irá utilizar. No nosso exemplo, o XML abaixo:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="titulo" android:id="@+id/titulo" android:layout_alignParentTop="true" android:layout_alignParentStart="true" android:layout_alignParentEnd="true" android:layout_marginLeft="30dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="horario" android:id="@+id/horario" android:layout_below="@+id/titulo" android:layout_alignParentStart="true" android:layout_alignParentEnd="true" android:layout_marginLeft="30dp" /> </RelativeLayout>
Crie um layout para os Itens. No nosso exemplo, o XML abaixo:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Favorito" android:id="@+id/favorito" android:layout_alignParentTop="true" android:layout_alignParentStart="true" android:checked="false" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="titulo" android:id="@+id/titulo" android:layout_toEndOf="@+id/favorito" android:layout_alignBottom="@+id/favorito" android:layout_alignParentEnd="true" android:layout_marginBottom="5dp" android:layout_marginLeft="15dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="horario" android:id="@+id/horario" android:layout_below="@+id/titulo" android:layout_alignStart="@+id/titulo" android:layout_alignParentEnd="true" /> <ImageView android:layout_width="wrap_content" android:layout_height="150dp" android:id="@+id/imagem" android:layout_below="@+id/horario" android:layout_alignParentStart="true" android:layout_alignParentEnd="true" /> </RelativeLayout>
Em seguida, você vai precisar de uma classe para implementar a interface BaseExpandableAdapter que te permitirá customizar a maneira que um ExpandableListView irá trabalhar com seus dados.
public class Adaptador extends BaseExpandableListAdapter {
private Context context;
private List<ProgramaResumido> programasResumidos;
private List<ProgramaDetalhado> programasDetalhados;
public Adaptador(Context context, List<ProgramaResumido> programasResumidos, List<ProgramaDetalhado> programasDetalhados){
this.context = context;
this.programasResumidos = programasResumidos;
this.programasDetalhados = programasDetalhados;
}
@Override
public int getGroupCount() {
return programasResumidos.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return 1;
}
@Override
public Object getGroup(int groupPosition) {
return programasResumidos.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return programasDetalhados.get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = View.inflate(context, R.layout.grupo, null);
}
TextView titulo = (TextView) convertView.findViewById(R.id.titulo);
TextView horario = (TextView) convertView.findViewById(R.id.horario);
ProgramaResumido programaResumido = programasResumidos.get(groupPosition);
titulo.setText(programaResumido.Titulo);
horario.setText(programaResumido.Horario);
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = View.inflate(context, R.layout.item, null);
}
CheckBox favorito = (CheckBox) convertView.findViewById(R.id.favorito);
TextView titulo = (TextView) convertView.findViewById(R.id.titulo);
TextView horario = (TextView) convertView.findViewById(R.id.horario);
ImageView imagem = (ImageView) convertView.findViewById(R.id.imagem);
ProgramaDetalhado programaDetalhado = programasDetalhados.get(groupPosition);
favorito.setChecked(programaDetalhado.Favorito);
titulo.setText(programaDetalhado.Titulo);
horario.setText(programaDetalhado.Horario);
imagem.setImageBitmap(programaDetalhado.Imagem);
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
Finalmente, criamos o Layout da Atividade do nosso App com o XML abaixo:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin"> <ExpandableListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/lista" android:layout_alignParentTop="true" android:layout_alignParentStart="true" /> </RelativeLayout>
E para o código da Atividade:
public class AtividadePrincipal extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_atividade_principal);
ExpandableListView lista = (ExpandableListView) findViewById(R.id.lista);
List<ProgramaResumido> programasResumidos = new ArrayList<ProgramaResumido>();
ProgramaResumido programaResumido = new ProgramaResumido();
programaResumido.Titulo = "Titulo Primeiro";
programaResumido.Horario = "Dia 01/01 as 23:00";
programasResumidos.add(programaResumido);
programaResumido = new ProgramaResumido();
programaResumido.Titulo = "Titulo Segundo";
programaResumido.Horario = "Dia 02/02 as 23:00";
programasResumidos.add(programaResumido);
programaResumido = new ProgramaResumido();
programaResumido.Titulo = "Titulo Terceiro";
programaResumido.Horario = "Dia 03/03 as 23:00";
programasResumidos.add(programaResumido);
List<ProgramaDetalhado> programasDetalhados = new ArrayList<ProgramaDetalhado>();
ProgramaDetalhado programaDetalhado = new ProgramaDetalhado();
programaDetalhado.Favorito = true;
programaDetalhado.Titulo = "Titulo Primeiro";
programaDetalhado.Horario = "Dia 01/01 as 23:00";
programaDetalhado.Imagem = BitmapFactory.decodeResource(getResources(), R.drawable.starstuff300150);
programasDetalhados.add(programaDetalhado);
programaDetalhado = new ProgramaDetalhado();
programaDetalhado.Favorito = false;
programaDetalhado.Titulo = "Titulo Segundo";
programaDetalhado.Horario = "Dia 02/02 as 23:00";
programaDetalhado.Imagem = BitmapFactory.decodeResource(getResources(), R.drawable.starstuff300150);
programasDetalhados.add(programaDetalhado);
programaDetalhado = new ProgramaDetalhado();
programaDetalhado.Favorito = true;
programaDetalhado.Titulo = "Titulo Terceiro";
programaDetalhado.Horario = "Dia 03/03 as 23:00";
programaDetalhado.Imagem = BitmapFactory.decodeResource(getResources(), R.drawable.starstuff300150);
programasDetalhados.add(programaDetalhado);
Adaptador adaptador = new Adaptador(getBaseContext(), programasResumidos, programasDetalhados);
lista.setAdapter(adaptador);
}
}
Deste modo, quando você rodar o aplicativo, verá algo parecido com as Figuras 1 e 2.
Quer ver mais dicas como esta? Acesso e o IAI? site.iai.art.br


