ExpandableListView no Android, Entendendo e Utilizando

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes! Você receberá um email de confirmação. Somente depois de confirma-lo é que eu poderei lhe enviar os conteúdos semanais exclusivos. Os artigos em PDF são entregues somente para os inscritos na lista.

Email inválido.
Blog /Android /ExpandableListView no Android, Entendendo e Utilizando

ExpandableListView no Android, Entendendo e Utilizando

Vinícius Thiengo
(13396) (46)
Go-ahead
"O método consciente de tentativa e erro é mais bem-sucedido que o planejamento de um gênio isolado."
Peter Skillman
Prototipagem Android
Capa do curso Prototipagem Profissional de Aplicativos
TítuloAndroid: Prototipagem Profissional de Aplicativos
CategoriasAndroid, Design, Protótipo
AutorVinícius Thiengo
Vídeo aulas186
Tempo15 horas
ExercíciosSim
CertificadoSim
Acessar Curso
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Lendo
TítuloManual de DevOps: como obter agilidade, confiabilidade e segurança em organizações tecnológicas
CategoriaEngenharia de Software
Autor(es)Gene Kim, Jez Humble, John Willis, Patrick Debois
EditoraAlta Books
Edição
Ano2018
Páginas464
Conteúdo Exclusivo
Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba gratuitamente conteúdos Android sem precedentes!
Email inválido

Opa, blz?

Nesse vídeo mostro como utilizar a view ExpandableListView no Android. Com a aparência de várias ListViews encadeadas com disposição dos itens em efeito sanfona na vertical. O ExpandableListView é muito comum quando se tem categorias, nesse caso é muito provável o seu uso. Logo no extends da classe BaseExpandableListAdapter há uma série de métodos obrigatórios, mas nenhum que queira um esforço grande para a implementação, apenas os métodos getGroupView() e getChildView(), porém isso vai depender de sua implementação (a apresentada no vídeo é bem tranquila). Acabo mostrando a forma de utilizar o método setGroupIndicator(), porém note que a utilização do método setChildIndicator() é exatamente no mesmo caminho, mas aplicado apenas nos elementos filhos do grupo do ExpandableListView. Ficar ligado que para ter o listener de clique nos elementos filhos é com o método setOnChildClickListener() que conseguimos isso. Então é isso, vou evitar mais delongas e deixar você assistir ao vídeo.

O link para download do projeto se encontra logo abaixo no post.

Segue links das classes apresentadas no vídeo:

Página da classe ExpandableListView no site oficial do Android

Página da interface ExpandableListAdapter no site oficial do Android

Página da classe BaseExpandableListAdapter no site oficial do Android

Vlw

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes!
Email inválido

Relacionado

ORMLite no Android, Entendendo e UtilizandoORMLite no Android, Entendendo e UtilizandoAndroid
Drag e Drop no Android, Entendendo e UtilizandoDrag e Drop no Android, Entendendo e UtilizandoAndroid
Iniciando com Dropbox API no AndroidIniciando com Dropbox API no AndroidAndroid
Download e Upload com Dropbox API no AndroidDownload e Upload com Dropbox API no AndroidAndroid

Compartilhar

Comentários Facebook

Comentários Blog (46)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
Sidnei Esteves (1) (0)
11/06/2019
Bom dia Vinicius! Excelente material parabéns! Tenho um situação e vê se você consegue me ajugar! Eu tenho o List pai com 3 opções e gostaria de expandir a lista com os filhos somente quando uma opção for selecionada como faço?
Responder
Vinícius Thiengo (0) (0)
16/08/2019
Sidnei, tuso bem?

Neste caso você pode trabalhar com o listener de abertura / fechamento do elemento pai utilizando a ExpandableListView.OnGroupClickListener.

No algoritmo deste listener você coloca o bloco condicional que vai verificar se o Button do elemento pai, elemento que está para ser expandido, foi ou não acionado pelo usuário.

Caso sim, retorne "false" em onGroupClick(). Caso contrário, retorne "true". E é isso mesmo: "false" para "sim" e "true" para "não".

Sidnei, no link a seguir tem um exemplo de implementação do listener OnGroupClickListener: https://stackoverflow.com/a/25489848/2578331

Sidnei,

Antes de finalizar, não sei se você esta acompanhando, mas no Blog eu iniciei uma nova série onde estamos desenvolvendo, do completo zero e de maneira gratuita, um aplicativo Android de mobile-commerce.

Muitas dicas e dúvidas também estão sendo liberadas e sanadas nesta série.

Ela foi feita para aqueles que também estão iniciando no desenvolvimento de aplicativos Android.

As aulas, acompanhadas de artigos e vídeos, são liberadas semanalmente para a lista de e-mails do Blog, que também é gratuita.

17 aulas já estão disponíveis. Segue o link da última aula liberada:

-> Como Desenvolver as Telas de Endereço de Entrega: https://www.thiengo.com.br/como-desenvolver-as-telas-de-endereco-de-entrega-android-m-commerce

Sidnei, não deixe de acompanhar esta série, ela certamente em algum momento será de grande utilidade em seus próprios projetos de desenvolvimento.

Abraço.
Responder
William Ribeiro de Oliveira (1) (0)
08/11/2018
Boa noite Vinicius, estou tentando implementar uma segunda linha no listviwer, mas sem sucesso. Já tentei varias maneiras, mas da erro, a primeira linha com o nome_convneio funciona perfeitamente, gostaria de acionar a segunda linha o endereço_convenio. Agradeço muito se puder me dar uma luz.

Segue abaixo os trechos do codigo
Att
William


--------------------------------- fonte trecho do adapter ----------------------------------

  @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ViewHolderItem holder;

        String val = (String) getChild(groupPosition, childPosition);


        if(convertView == null){
            convertView = inflater.inflate(R.layout.item_expandable_listview,null);
            holder =  new ViewHolderItem();
            convertView.setTag(holder);

            holder.tvItem = convertView.findViewById(R.id.tvItem);
            holder.tvEndereco = convertView.findViewById(R.id.tvEndereco);

        }else{
            holder = (ViewHolderItem) convertView.getTag();
        }

        holder.tvItem.setText(val);
        holder.tvEndereco.setText(val);



        return convertView;

    }


-------------------------------------- fonte que preeche o expandablelistviewer -----------------------------------

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        cliente          = new AsyncHttpClient();
        Contador_Catagorias = 0;
        View v = inflater.inflate(R.layout.fragment_convenios, container, false);
        builList();
        variavelAdapter = new ExpandableAdapter(getActivity(),listGroup,listData);
        ExpandableListView expandableListView = v.findViewById(R.id.expandableListView);
        expandableListView.setAdapter(variavelAdapter);
        return v;
    }
    public void builList(){
        listGroup     = new ArrayList<String>();
        listData      = new HashMap<String , List<String>>();
        xCategoria    = "";
        xItem         = "";
        xEndereco     = "";

        String urlm = getResources().getString(R.string.HOST) + "convenio_categorias_app.php";
        cliente.post(urlm, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                if(statusCode == 200){
                    try {
                        JSONArray arr = new JSONArray(new String(responseBody));

                        xCategoria = arr.getJSONObject(0).getString("Nome_Categoria");
                        xItem = arr.getJSONObject(0).getString("NomeFantasia");
                        xEndereco = arr.getJSONObject(0).getString("Endereco");

                        //adciona a primeira categoria
                        listGroup.add(xCategoria);
                        ArrayList<String> auxList = new ArrayList<String>();

                        for(int i=1;i<arr.length();i++){


                            if (xCategoria.equals(arr.getJSONObject(i).getString("Nome_Categoria"))){
                                //constroi a lista de uma categoria
                                xItem = arr.getJSONObject(i).getString("NomeFantasia");
                                xEndereco = arr.getJSONObject(i).getString("Endereco");
                                auxList.add(xItem);
                                //auxList.add(xEndereco);
                            }else{
                                //termina a categoria
                                listData.put(listGroup.get(Contador_Catagorias),auxList);
                                Contador_Catagorias++;
                                auxList = new ArrayList<String>();
                                xCategoria = arr.getJSONObject(i).getString("Nome_Categoria");
                                xItem = arr.getJSONObject(i).getString("NomeFantasia");
                                xEndereco = arr.getJSONObject(i).getString("Endereco");
                                //adiciona a proxima categoria
                                listGroup.add(xCategoria);
                                auxList.add(xItem);
                                //auxList.add(xEndereco);
                            }
                        }
                        variavelAdapter.notifyDataSetChanged();
                        listData.put(listGroup.get(0),auxList);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }
            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                Toast.makeText(getContext(),"Servidor indisponivel",Toast.LENGTH_LONG).show();
            }
        });
    }

----------------------------------------- fonte da classe ------------------------------------------------

package br.com.makecardassociado.makecardassociado;
public class convenios_categorias {
    private String CODIGO;
    private String NOMEFANTASIA;
    private String ENDERECO;
    public convenios_categorias(String CODIGO, String NOMEFANTASIA, String ENDERECO) {
        this.CODIGO = CODIGO;
        this.NOMEFANTASIA = NOMEFANTASIA;
        this.ENDERECO = ENDERECO;
    }
    public String getCODIGO() {
        return CODIGO;
    }
    public void setCODIGO(String CODIGO) {
        this.CODIGO = CODIGO;
    }
    public String getNOMEFANTASIA() {
        return NOMEFANTASIA;
    }
    public void setNOMEFANTASIA(String NOMEFANTASIA) {
        this.NOMEFANTASIA = NOMEFANTASIA;
    }
    public String getENDERECO() {
        return ENDERECO;
    }
    public void setENDERECO(String ENDERECO) {
        this.ENDERECO = ENDERECO;
    }
}
Responder
Vinícius Thiengo (0) (0)
15/11/2018
William, tudo bem?

Você quer adicionar uma segunda linha dentro do layout de item filho de cada listagem de grupo de seu ExpandableListView?

Se sim, você deve atualizar o layout de item filho de agrupamentos do ExpandableListView, colocando mais uma linha (TextView) nesse layout.

Provavelmente você também terá de atualizar o método getChildView(). Confesso que fiquei um pouco confuso com o código apresentado. Você está com a seguinte estrutura?

-> Lista de objetos de grupo;

---> Cada objeto de grupo contém também uma lista de itens filho apresentados via getChildView().

---> Cada objeto de grupo contém também uma lista de itens filho apresentados via getChildView().

Abraço.
Responder
Vinícius Thiengo (0) (0)
15/11/2018
William,

Ignore o último "---> Cada objeto de grupo contém também uma lista de itens filho apresentados via getChildView()." da mensagem acima.

Abraço.
Responder
William Ribeiro de Oliveira (2) (0)
29/10/2018
Boa tarde Vinicius, eu implementei o ExpandableListView no Android, Entendendo e Utilizando, que vc publicou no youtube, so que estou usando fragment, mas garrei nessa parte onde : "ExpandableAdapter(getActivity(),listGroup,listData));" o listGroup e listData chega vazio. Mesmo chamando a função "public void builList(){" que carrega todos os dados do meu banco de dados antes mas quando sai do escolpo "public void onSuccess" ele nao mantem os dados em listGroup e listData e esses dois estao declarados no inicio do arquivos antes do onCreateView.

segue abaixo trecho do codigo fonte

Agradeço a atenção se puder me ajudar

Att
William


  private List<String> listGroup;
  private HashMap<String, List<String>> listData;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        cliente          = new AsyncHttpClient();
        Contador_Catagorias = 0;
        View v = inflater.inflate(R.layout.fragment_convenios, container, false);
        builList();
        ExpandableListView expandableListView =
        v.findViewById(R.id.expandableListView);
        expandableListView.setAdapter(new
        ExpandableAdapter(getActivity(),listGroup,listData));
        return v;
    }
    public void builList(){
        listGroup         = new ArrayList<String>();
        listData          = new HashMap<String , List<String>>();
        xCategoria = "";
        xItem      = "";

        String urlm = getResources().getString(R.string.HOST) + "convenio_categorias_app.php";
        cliente.post(urlm, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                if(statusCode == 200){
                    try {
                        JSONArray arr = new JSONArray(new String(responseBody));

                        xCategoria = arr.getJSONObject(0).getString("Nome_Categoria");
                        xItem = arr.getJSONObject(0).getString("NomeFantasia");

                        listGroup.add(xCategoria);
                        List<String> auxList = new ArrayList<String>();

                        for(int i=1;i<arr.length();i++){

                            if (xCategoria.equals(arr.getJSONObject(i).getString("Nome_Categoria"))){
                                xItem = arr.getJSONObject(i).getString("NomeFantasia");
                                auxList.add(xItem);
                            }else{
                                listData.put(listGroup.get(Contador_Catagorias),auxList);
                                Contador_Catagorias++;
                                auxList = new ArrayList<String>();
                                xCategoria = arr.getJSONObject(i).getString("Nome_Categoria");
                                xItem = arr.getJSONObject(i).getString("NomeFantasia");

                                listGroup.add(xCategoria);

                                auxList.add(xItem);
                            }
                        }
                        //listData.put(listGroup.get(0),auxList);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }
            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable
            error) {
                Toast.makeText(getContext(),"Servidor indisponivel",Toast.LENGTH_LONG).show();
            }
        });
    }
Responder
Vinícius Thiengo (0) (0)
30/10/2018
William, tudo bem?

O problema de seu algoritmo está que: o acesso aos dados de seu banco de dados remoto ocorre de maneira assíncrona, mas a criação do adapter do ExpandableListView está sendo sequencial, como se o acesso aos dados remotos fosse síncrona.

Uma possível correção é a seguinte:

-> Crie uma nova variável de instância, como você fez com as variáveis listGroup e listData, e essa nova variável de instância conterá o adapter ExpandableAdapter;

-> Inicie essa nova variável de instância ainda em onCreateView(), como: expandableAdapter = ExpandableAdapter(...);

-> No final do método onSuccess() invoque: expandableAdapter.notifyDataSetChanged().

William, dessa forma a lista de dados será apresentada em tela, obviamente que depois do delay de carregamento de dados remotos.

Abraço.
Responder
William Ribeiro de Oliveira (1) (0)
30/10/2018
Muito obrigado Vinicius, vou implementar aqui a solução e te dou o retorno.
Att
William
Responder
William Ribeiro de Oliveira (1) (0)
31/10/2018
Bom dia Vinicius, fiz modificação que vc indicou e deu 100% certo.
Muito obrigado mesmo, salvou minha vida.Valeu.
Responder
17/05/2018
Eu gostaria de colocar um icone diferente em cada grupo, como faço?
Responder
Vinícius Thiengo (0) (0)
19/05/2018
Lucas, tudo bem?

Tente o seguinte roteiro:

-> Crie um adapter de ExpandableListView que implemente a Interface ExpandableListAdapter;

-> Dentre todos os métodos de implementação obrigatória você terá o getGroupView() onde tem de fornecer o layout de grupo. Defina um layout que também contenha um ImageView para receber o ícone;

-> Na classe de objetos de grupo, adicione o campo que conterá o path da imagem de ícone, mesmo que seja um path remoto (site na Web);

-> Adicione ao projeto alguma API de carregamento de imagem, assim você não precisará quebrar a cabeça sobre imagens locais ou remotas. Uma API que indico é a Picasso: http://square.github.io/picasso/

-> Ainda no algoritmo de getGroupView() adicione os códigos que acessam o ícone de grupo no objeto de grupo e então passe ao objeto da API de carregamento de imagens o ImageView de ícone e o path do ícone.

Lucas, desta forma você terá um ícone distinto para cada grupo de seu  ExpandableListView.

A seguir deixo dois outros links que podem lhe ajudar com a implementação:

-> ExpandableListAdapter Tutorial With Example In Android Studio: http://abhiandroid.com/ui/expandablelistadapter-example-android.html

-> Doc do ExpandableListAdapter: https://developer.android.com/reference/android/widget/ExpandableListAdapter

Abraço.
Responder
Willian Ferreira (1) (0)
28/11/2017
Olá Thiengo, gostaria de saber se tem como realizar a chamada dos dados vindo do sqlite para o expandable list view
Responder
Vinícius Thiengo (0) (0)
30/11/2017
Willian, tudo bem?

Tem como sim. Qualquer View Android, como o ExpandableListView, é independente da fonte de dados, logo o SIM é válido também para qualquer outra base que você venha a utilizar.

Abraço.
Responder
dluisbr (1) (0)
02/08/2017
Fala Thiengo, blz.
Vc teria algum exemplo de como implementar  ExpandableListView em um navigation drawer menu.
Responder
Vinícius Thiengo (0) (0)
03/08/2017
Dluisbr, tudo bem?

Veja se a API do link a seguir lhe ajuda com isso: https://github.com/msahakyan/expandable-navigation-drawer

Também o passo a passo para a construção de um Expandable-Drawer descrito neste item do StackOverflow: https://stackoverflow.com/a/42725878/2578331

No Android-Arsenal também pode haver alguma API com a funcionalidade que está buscando, veja os dois links a seguir:

https://android-arsenal.com/search?q=expandable
https://android-arsenal.com/search?q=navigationdrawer

Abraço.
Responder
24/09/2016
Muito Obrigado Thiengo... O segredo era o segundo objeto e mudar o construtor com esse segundo parâmetro. Sensacional! Obrigado pela rapidez na resposta. Você é mesmo o cara!
Responder
Luciano (1) (0)
22/09/2016
excelente vídeo! Como faria pra fazer um expandeble com 2 text view na child? tem como passar um dos 2 textos como parâmetro para uma outra activity?
Obrigado!!!
Responder
Vinícius Thiengo (0) (0)
24/09/2016
Luciano, blz?
No layout personalizado que você construiu para os itens do Expandable, coloque nele dois Textviews. O conteúdo desses TextViews deverão vir de uma lista que é atribuída ao adapter do Expandable.

Na verdade cada item terá um objeto na lista com o conteúdo de seu respectivo TextView 1 e 2.

Coloque o listener de clique no Expandable. Quando houver o clique acesse a lista na posição correta (vai ter um parâmetro para o grupo e o child) e então escolha o texto que quer enviar a outra Activity, coloque ele no Intent (http://www.thiengo.com.br/enviando-e-recebendo-dados-entre-activities-em-android ) e chame a outra Activity via startActivity().

Veja se assim vai sem problemas. Abraço
Responder
Rafael Carlos (1) (0)
12/08/2016
Rafael Carlos · Assistente de T.I em Ciclo Cairu
Bom dia!

Tentei criar ids únicos, mas não consegui.

Meu intuito é colocar Chekboxs dentro do Expandable pro usuário ir selecionando o que ele deseja dentro de cada lista.

Você deu o exemplo de utilizar um objeto que tenha o campo id, fiz isso mas não deu certo.
Responder
Vinícius Thiengo (0) (0)
17/08/2016
Fala Rafael, blz?
Nos objetos que representam os itens, utilize flags (variaveis de instancia booleanas) para representar o status dos checkboxes de cada item. Assim, no adapter de seu Expandable, verifique em cada objeto se o chackbox já deve iniciar marcado ou não.
Responder
Tatiana (1) (0)
01/01/2016
Ola Thiengo, Feliz 2016!!! Seu blog eh otimo... Praticamente todo meu projeto fiz baseado em suas videos aula... :D... Mas como sendo iniciante em android... Tenho VARIASSSS duvidas!!! kakakakakaka... Montei uma expandableList baseado no seu tutorial e funciona perfeitamente. Mas o que no fundo eu preciso: Fazer a parte dos itens via codigo, assim eu poderia incluir qts textviews forem necessarias, alterar fundo de textview conforme satisfacao do cliente, e etc. Vc tem algum exemplo disto? Obrigada,Tatiana...
Responder
Vinícius Thiengo (0) (0)
02/01/2016
Fala Tatiana, feliz 2016 para ti tb.
Os itens vc pode utilizar a instanciação via Java API, exemplo:

TextView tv = new TextView(this);
tv.setBackgroundColor(Color.BLUE);

Depois retorna-lo como sendo a view de retorno do método de criação de itens. Isso que fiz com o TextView vc pode fazer com praticamente todas as outras Views. Abraço
Responder
15/12/2015
Olá thiengo
Segui o tutorial e criei já meu próprio código com base do mostrado, agora quero popular a expandable com dados da web através de Json, qual a melhor forma de fazer isso? Você teria alguma dica?
A expandableListView se encontra dentro de um fragment dentro de uma slidingTab, mas quando altero as listas de dados estes não se alteram e não existe o método notifyDataChange.
Responder
Vinícius Thiengo (0) (0)
15/12/2015
Fala André, blz?
Utilize o Retrofit 2.0 (http://www.thiengo.com.br/library-retrofit-2-no-android ) para obter is dados de seu server web, essa library é a mais eficiente para esse tipo de chamada (ao servidor). Quanto ao método de atualização, tentou o notifyDataSetChanged ao invés de notifyDataChange? Abraço
Responder
Fabricio (1) (0)
05/09/2015
Fala Thiengo, blza?
Sabe dizer se é com o expandable que faz o Expand/Collapse do material design?

https://www.google.com/design/spec/components/lists-controls.html#lists-controls-types-of-list-controls

estou usando ele pra tentar fazer um FAQ com Título, Descrição e com a seta do lado direito, mas dependendo do tamanho do título a seta muda de tamanho também, outra coisa é  um separador entre os grupos somente, por que ele coloca separador nos filhos também e fica esquisito, pode dar um help com isso?

Desde já obrigado.. Vc é o cara, tem me ajudado muito na jornada com o android. Abraço!
Responder
Vinícius Thiengo (1) (0)
05/09/2015
Fala Fabricio, blz?
Dê uma olhada nas respostas desse link (http://stackoverflow.com/questions/27203817/recyclerview-expand-collapse-items ). A do LinearLayout é a que eu recomendaria junto a animação com ObjectAnimator (http://www.thiengo.com.br/objectanimator-no-android-aplicando-efeitos-nos-componentes-visuais ). A versão 2.x da APP do Blog utilizava uma bottom bar que tive de implementar na mão com Views e o ObjectAnimator, pois não tinha encontrado nada igual, logo como não vi ainda um script easy com esse list Expand/Collapse, pode ser essa a melhor solução. Mas nesse caso é com RecyclerView apenas, então as linhas nos itens filhos não será mais problema, pois o layout do item será criado por ti. Abraço
Responder
Fabricio (1) (0)
05/09/2015
Ninja até nas respostas hehehe! então, logo em seguida consegui ajustar o indicator da seguinte forma: no getGroupView do adapter, peguei a ImageView que coloquei no header e troco a imagem do item selecionado.
final ImageView indicator = (ImageView)convertView.findViewById(R.id.indicator);

        if (isExpanded) {
            indicator.setImageResource(R.drawable.chevron_up);
        } else {
            indicator.setImageResource(R.drawable.chevron_down);
        }
pra colocar do lado direito:
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android "
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:padding="10dp"
    android:gravity="center">

    <TextView
        android:id="@+id/tvGroup"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:textColor="@color/md_text"
        android:textStyle="bold"
        android:textSize="16dp"/>

    <ImageView
        android:id="@+id/indicator"
        android:layout_width="50dp"
        android:layout_height="wrap_content" />

</LinearLayout>
só faltou a linha nos itens filho e o Animator pra ficar perfeito :D (fora o efeito ripple que acho desnecessário neste caso)... Mas vou dar uma olhada no que você mandou.. Valeu mesmo Thiengo!!
Responder
Roberto Bruno (1) (0)
23/02/2015
Olá Thiengo, muito bom o seu site, otima didatica, tenho uma duvida no Expandable, no momento de por um click pra iniciar outra activity nos items filhos, qual metodo utilizar? onitemCLick? to tendo problema nos parametros, vc teria algum exemplo deste Expandable com click iniciando outra activity?
Responder
Vinícius Thiengo (2) (0)
24/02/2015
Fala Roberto, blz?
Vê se assim vai sem problemas:

expandableList.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {

            @Override
            public boolean onChildClick(ExpandableListView parent,
            View v,
            int groupPosition,
            int childPosition,
            long id) {
                
                Intent intent = new Intent(SuaActivityAtual.this, ProximaActivity.class);
                startActivity(intent);
                return true;
            }
        });

Abraço
Responder
Roberto Bruno (1) (0)
26/02/2015
Opa, Muito Obrigado Thiengo, Me ajudou muito consegui implementar, Obrigado pela atenção, Muito bom o seu Blog, Parabéns.

Abraços
Responder
Diógenes (0) (0)
04/02/2015
Eaw Thiengo,
Seus vídeo são os melhores. Mano na lista com os childs usando o componente Textview dá tudo certo, mas, quando troco para um Checkbox o método isChildSelectable e o listener setOnChildClickListener não são chamados quando acontece um clique. Existe algum listener específico para checkbox ou alguma outra maneira de capturar quando o mesmo for marcado ?
Responder
Vinícius Thiengo (1) (0)
05/02/2015
Fala Diógenes, blz?
Encontrei esse link no stackoverflow (http://stackoverflow.com/questions/5068668/android-expandablelistview-with-checkbox-controlling-checked-state ). Aparentemente a problemática do camarada era a mesma que a sua e assim somebody else deu a resposta correta. Dê uma olhada lá. Abraço
Responder
Rodolfo (0) (0)
23/01/2015
Fala Thiengo blz, queria agradecer pela ajuda nas perguntas anteriores , bom tenho outra duvida sobre como diminuir a largura do grupo(ExpandableListView), pois elas ficam bem larga na exibição da tela, onde eu tenho uma EditText no meio da lista, na hora de digitar o teclado fica em cima do EditText como não tem jeito de colocar uma ScrollView que resolveria no caso,então eu gostaria de diminuir um pouco a largura lista (ExpandableListView) pra vê resolveria.
agradeço desde já.
valeu.
Responder
Vinícius Thiengo (1) (0)
24/01/2015
Fala Rodolfo, blz?
Tentou alterar o dado em android:layout_width="...", colocar por exemplo android:layout_width="200dp", ou até mesmo deixar android:layout_width="match_parent", porém com margem: android:layout_marginRight="10dp" e android:layout_marginLeft="10dp". Abraço
Responder
20/01/2015
muito bom, mas no caso de eu precisar inflar layouts diferentes ex: no primeiro grupo seria uma lista de produtos, no segundo grupo outro layout com forma de pagamento como faria isso?
Responder
Vinícius Thiengo (2) (0)
21/01/2015
Fala Hudson, blz?
No método getChildView() vc tem acesso ao groupPosition, logo com if...else vc consegue definir um layout diferente para cada child group. Abraço
Responder
Rodolfo (1) (0)
12/01/2015
Thiengo , blz.
Muito bom essa vídeo aula . Gostaria de fazer uma pergunta. Como que faz ao clicar no item(child) executar um operação , chamar um meto criado, alguma coisa de desse tipo.
Obrigado desde já.
Responder
Vinícius Thiengo (1) (0)
12/01/2015
Fala Rodolfo, blz sim
Tentou em sua instancia do ExpandableListView fazer algo assim:

instanciaExpandable.setOnChildClickListener(new ExpandableListView.OnChildClickListener(){
@Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                // algo aqui
                return true;
            }
});

Abraço
Responder
Rodolfo (0) (0)
15/01/2015
Fala Thiengo blz, sem querer de abusar da vontade,procurei na internet e não encontro nada a respeito, você poderia me ajudar num código no android, quando ele exibe um valor muito pequeno como 0.0000001, ele mostra algo do tipo 1.0E-6, e quando ele exibe um valor muito alto como 10000000 ele mostra algo do tipo 1.0E7.
Tem como mostra esse números de maior de menor sem exibir esses códigos.
um abraço e parabéns pelo blog
agradeço desde já.
valeu.
Responder
Vinícius Thiengo (0) (0)
16/01/2015
Fala Rodolfo, blz?
Tente utilizar o BigDecimal do Java (http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html ). Abraço
Responder
15/10/2014
Thiengo, blz!?
Muito bom esse vídeo, hein! Pode em ajudar? Não consigo de forma nenhuma escutar o clique em um grupo da lista. O método isChildSelectable() está retornando true e os métodos setOnChildClickListener(), setOnGroupExpandListener() estão implementados. Que diabos pode estar acontecendo? Eu to usando Fragment no projeto.
Responder
Vinícius Thiengo (0) (0)
15/10/2014
Fala Carlos, blz?
Então assim ta meio dificil de enxergar o problema, cole a parte problemática do código aqui (listaners e assinaturas dos listeners). Vc verificou com o LogCat se ao menos está entrando nos listeners, pois as vezes devido ao Try...Catch nós estamos entrando, mas devido a problemas de exception isso de não funcionar pode ocorrer. Abraço
Responder
PedroBonfim (0) (0)
04/09/2014
fala Thiengo, blz? uma pergunta q n tem muito a ver com o que foi dito nessa aula, mas voc? tem v?deos de como fazer interface gr?fica no Android? ou pensa em fazer? se n?o como voc? fez essa do seu aplicativo? algum programa que voc? indicaria para fazer, ou um livro
Responder
Vinícius Thiengo (0) (0)
04/09/2014
Fala Pedro, blz?
Então, vídeo especifico ensinando a montar um layout no Android eu não fiz, tenho vídeos falando sobre alguns componentes visuais, como LinearLayout, RelativeLayout... mas para construir layouts em Android é como em HTML, eu costumo desenhar tudo no papel e depois passar para o XML do Android. O que recomendo fortemente é que vc conheça os principais componentes visuais (TextView, EditText, LinearLayout, Button, Spinner, ...) e domine os atributos das tags XML do Android, com isso a imaginação cria forma fácil no seu layout. Abraço
Responder
Wiliam (0) (0)
01/09/2014
Muito bom cara, sempre com assuntos interessantes, já virei fã do blog.

Thiengo vc pode me tirar uma duvida? para que serve o método requestFocus() da classe View? desde já obrigado!
Responder
Vinícius Thiengo (1) (0)
01/09/2014
Fala Willian, blz?
Então, se não me engano é para dar o foco (abre o teclado virtual para o camarada começar a digitar...) na View que permite entrada (EditText, por exemplo). Abraço
Responder