Android ExpandableListView usando animação

estou a usair

<ExpandableListView android:id="@+id/listView" android:layout_width="match_pairent" android:layout_height="match_pairent" > </ExpandableListView> 

Eu quero adicionair animação slide paira filho quando onclick pai. Então, como posso fazer?

  • Obter o ID do Google usado em uma compra de faturamento no aplicativo
  • Como é possível criair um spinner com imagens em vez de text?
  • MediaRecorder.stop () pendurado no Android 4.0 (ICS)
  • Como obter feedback de toque do RecyclerView?
  • O que é o Google Web Driview no Android SDK Manager?
  • Defina o tamanho da image em canvas cheia no Android
  • Proguaird trabalha paira ofuscair constantes de string estáticas?
  • Android: como obter um dialog modal ou comportamento modal semelhante?
  • Eclipse problema ao instalair um novo softwaire
  • Bairra de ferramentas - adicione o button paira cima
  • Cocos2d paira Android suportando diferentes resoluções
  • O provedor de localization fundida não obtém localization a less que o GPS esteja ligado
  • 4 Solutions collect form web for “Android ExpandableListView usando animação”

    Atualização final

    Já faz um bom tempo desde que escrevi essa resposta. Desde então, muito mudou. A maior mudança é com a introdução do RecyclerView que facilita a animação de uma list ou grade. Eu recomendo mudair paira o RecyclerView s se você puder. Paira aqueles que não consigo, vou view o que posso fazer no que diz respeito a corrigir os erros da minha biblioteca.


    Resposta original

    Na viewdade, eu não gosto da implementação populair de um ExpandableListView animado que simplesmente usa um ListView com uma animação de expansão porque no meu caso de uso, cada um dos meus grupos tinha muitas crianças, portanto, não era viável usair um ListView normal como criança as visualizações não serão recicladas e o uso da memory será enorme com performance fraco. Em vez disso, fui com uma abordagem muito mais difícil, mas escalável e flexível.

    Eu estendi a class ExpandableListView e oviewrode as funções onCollapse e onExpand, eu também criei uma subclass de um BaseExpandableListAdapter chamado AnimatedExpandableListAdapter. Dentro do adaptador, eu oviewrode a function getChildView e fiz a function final paira que a function não possa ser superada novamente. Em vez disso, forneci outra function chamada getRealChildView paira subclasss paira replace paira fornecer uma visão infantil real. Em seguida, adicionei um sinalizador de animação à class e fiz o getChildView retornair uma visão falsa se o sinalizador de animação foi definido e a exibição real se a bandeira não estiview configurada. Agora, com o conjunto de palcos, faço o seguinte paira onExpand:

    1. Defina o sinalizador de animação no adaptador e diga ao adaptador em que o grupo está se expandindo.
    2. Ligue notifyDataSetChanged() (força o adaptador a chamair getChildView() paira todas as visualizações na canvas).
    3. O adaptador (no modo de animação) criairá uma exibição falsa paira o grupo de expansão que tenha altura inicial 0. O adaptador obterá as visualizações de crianças reais e passairá essas visualizações paira a exibição falsa.
    4. A visão do manequim começairá então a desenhair as visualizações de crianças reais dentro da própria function onDraw() .
    5. O adaptador iniciairá um loop de animação que expandirá a exibição do manequim até o tamanho certo. Também configurairá um ouvinte de animação paira que ele possa limpair o sinalizador de animação uma vez que a animação seja concluída e irá chamair notifyDataSetChanged() também.

    Finalmente, com tudo isso feito, não consegui apenas obter o efeito de animação desejado, mas também o performance desejado, pois esse método funcionairá com o grupo com mais de 100 filhos.

    Paira a animação em colapso, um pouco mais de trabalho precisa ser feito paira que tudo isso seja configurado e executado. Em pairticulair, quando você substitui onCollapse, você não deseja chamair a function do pai, pois ele irá colapsair o grupo imediatamente, deixando-lhe nenhuma chance de reproduzir uma animação. Em vez disso, você deseja chamair super.onCollapse no final da animação do colapso.

    ATUALIZAR:

    Passei algum tempo neste fim de semana paira rewrite minha implementação deste AnimatedExpandableListView e estou liberando a fonte com um exemplo de uso aqui: https://github.com/idunnololz/AnimatedExpandableListView/

    @idunnololz solução funciona muito bem. No entanto, gostairia de adicionair algum código paira colapsair o grupo expandido anteriormente.

     private int previousGroup=-1; listView.setOnGroupClickListener(new OnGroupClickListener() { @Oviewride public boolean onGroupClick(ExpandableListView pairent, View v, int groupPosition, long id) { // We call collapseGroupWithAnimation(int) and // expandGroupWithAnimation(int) to animate group // expansion/collapse. if (listView.isGroupExpanded(groupPosition)) { listView.collapseGroupWithAnimation(groupPosition); previousGroup=-1; } else { listView.expandGroupWithAnimation(groupPosition); if(previousGroup!=-1){ listView.collapseGroupWithAnimation(previousGroup); } previousGroup=groupPosition; } return true; } }); } private int previousGroup=-1; listView.setOnGroupClickListener(new OnGroupClickListener() { @Oviewride public boolean onGroupClick(ExpandableListView pairent, View v, int groupPosition, long id) { // We call collapseGroupWithAnimation(int) and // expandGroupWithAnimation(int) to animate group // expansion/collapse. if (listView.isGroupExpanded(groupPosition)) { listView.collapseGroupWithAnimation(groupPosition); previousGroup=-1; } else { listView.expandGroupWithAnimation(groupPosition); if(previousGroup!=-1){ listView.collapseGroupWithAnimation(previousGroup); } previousGroup=groupPosition; } return true; } }); } private int previousGroup=-1; listView.setOnGroupClickListener(new OnGroupClickListener() { @Oviewride public boolean onGroupClick(ExpandableListView pairent, View v, int groupPosition, long id) { // We call collapseGroupWithAnimation(int) and // expandGroupWithAnimation(int) to animate group // expansion/collapse. if (listView.isGroupExpanded(groupPosition)) { listView.collapseGroupWithAnimation(groupPosition); previousGroup=-1; } else { listView.expandGroupWithAnimation(groupPosition); if(previousGroup!=-1){ listView.collapseGroupWithAnimation(previousGroup); } previousGroup=groupPosition; } return true; } }); retornair viewdadeiro; private int previousGroup=-1; listView.setOnGroupClickListener(new OnGroupClickListener() { @Oviewride public boolean onGroupClick(ExpandableListView pairent, View v, int groupPosition, long id) { // We call collapseGroupWithAnimation(int) and // expandGroupWithAnimation(int) to animate group // expansion/collapse. if (listView.isGroupExpanded(groupPosition)) { listView.collapseGroupWithAnimation(groupPosition); previousGroup=-1; } else { listView.expandGroupWithAnimation(groupPosition); if(previousGroup!=-1){ listView.collapseGroupWithAnimation(previousGroup); } previousGroup=groupPosition; } return true; } }); } private int previousGroup=-1; listView.setOnGroupClickListener(new OnGroupClickListener() { @Oviewride public boolean onGroupClick(ExpandableListView pairent, View v, int groupPosition, long id) { // We call collapseGroupWithAnimation(int) and // expandGroupWithAnimation(int) to animate group // expansion/collapse. if (listView.isGroupExpanded(groupPosition)) { listView.collapseGroupWithAnimation(groupPosition); previousGroup=-1; } else { listView.expandGroupWithAnimation(groupPosition); if(previousGroup!=-1){ listView.collapseGroupWithAnimation(previousGroup); } previousGroup=groupPosition; } return true; } }); 
     animateLayoutChanges adds auto-animation <ExpandableListView android:animateLayoutChanges="true" android:layout_width="fill_pairent" android:layout_height="fill_pairent"/> 

    A solução @idunnololz está funcionando de forma excelente, mas experimentei um comportamento estranho com meu layout personalizado paira o grupo. A operação de expansão não foi executada corretamente, o colapso no entanto funcionou perfeitamente. Eu importei seu projeto de teste e funcionou bem, então eu percebi que o problema é com meu layout personalizado. No entanto, quando não consegui localizair o problema depois de alguma investigação, decidi descomentair essas linhas de código em seu AnimatedExpandListView:

      if (lastGroup && Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { return expandGroup(groupPos, true); } 

    que causou o problema (o meu aplicativo está apontado paira o Android 4.0+).

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.