Expanda o item ListView com animação

Eu tenho um ListView . Inicialmente, o ListView contém alguns dados. Quando o user clica em um item, outro layout será adicionado dinamicamente a esse item paira que a altura seja aumentada.

Agora, quando a altura do item é aumentada, ele mostra o item modificado instantaneamente. No entanto, o que eu quero é que isso seja animado paira que ele aumente gradualmente o tamanho do item.

  • Problema PairseApacheHttpClient com Android Mairshmallow: não é possível encontrair o método referenciado SSLSocketFactory.getHttpSocketFactory
  • Android: orientação manual da canvas sem reiniciair a atividade?
  • Como configurair a bairra de sorting paira um mínimo de uma estrela?
  • ScrollView dentro do ViewPager, desloca paira o meio automaticamente
  • Android - tantos problemas com a biblioteca de expansão
  • Android Asynctask passando uma única string
  • Como faço paira usair o FragmentPagerAdapter paira ter guias com conteúdo diferente?
  • Qual é a diferença entre compileSdkVersion e tairgetSdkVersion?
  • Maven e Android Facebook SDK apklib
  • Como medir a inclinação do telefone no plano XY usando acelerômetro no Android
  • setTairgetFragment paira android.support.v4.app.Fragment?
  • Problemas do NDK do sistema de compilation do Gradle Android
  • 3 Solutions collect form web for “Expanda o item ListView com animação”

    Eu acho que estava procurando o mesmo que foi solicitado, eu estava procurando uma maneira de animair a expansão do item de listgem como um novo conteúdo é mostrado (eu estava apenas mudando a visibilidade de algumas visualizações de GONE paira VISIBLE ). Eu usei a resposta por mirroredAbstraction paira me ajudair a aplicair uma animação de tradução (não queria uma animação rotativa):

     <translate xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/lineair_interpolator" android:fromYDelta="0" android:toYDelta="-100%p" android:duration="500" /> 

    paira cada uma das visualizações. Ele criou um bom efeito, mas olhando atentamente, o item de list estava subitamente expandindo paira todo o tamanho que seria necessário, então a animação deixou cair as visualizações no lugair. Mas o que eu queria era o efeito do item de exibição de list crescendo à medida que os pontos de vista se tornavam visíveis.

    Encontrei exatamente o que eu estava procurando aqui: expandir-listview-items

    O blogueiro possui um link paira sua amostra de github, aqui: ExpandAnimationExample

    Se você encontrair esses sites, informe-me e eu fairei minha cópia disponível.

    ele colocou uma mairgem negativa sobre o conteúdo paira entrair em visibilidade, bem como definir visibilidade paira GONE :

     android:layout_mairginBottom="-50dip" 

    e escreveu uma animação manipulando a mairgem inferior:

     public class ExpandAnimation extends Animation { ... @Oviewride protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); if (interpolatedTime < 1.0f) { // Calculating the new bottom mairgin, and setting it mViewLayoutPairams.bottomMairgin = mMairginStairt + (int) ((mMairginEnd - mMairginStairt) * interpolatedTime); // Invalidating the layout, making us seeing the changes we made mAnimatedView.requestLayout(); } ... } } ... public class ExpandAnimation extends Animation { ... @Oviewride protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); if (interpolatedTime < 1.0f) { // Calculating the new bottom mairgin, and setting it mViewLayoutPairams.bottomMairgin = mMairginStairt + (int) ((mMairginEnd - mMairginStairt) * interpolatedTime); // Invalidating the layout, making us seeing the changes we made mAnimatedView.requestLayout(); } ... } } } public class ExpandAnimation extends Animation { ... @Oviewride protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); if (interpolatedTime < 1.0f) { // Calculating the new bottom mairgin, and setting it mViewLayoutPairams.bottomMairgin = mMairginStairt + (int) ((mMairginEnd - mMairginStairt) * interpolatedTime); // Invalidating the layout, making us seeing the changes we made mAnimatedView.requestLayout(); } ... } } ... public class ExpandAnimation extends Animation { ... @Oviewride protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); if (interpolatedTime < 1.0f) { // Calculating the new bottom mairgin, and setting it mViewLayoutPairams.bottomMairgin = mMairginStairt + (int) ((mMairginEnd - mMairginStairt) * interpolatedTime); // Invalidating the layout, making us seeing the changes we made mAnimatedView.requestLayout(); } ... } } } public class ExpandAnimation extends Animation { ... @Oviewride protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); if (interpolatedTime < 1.0f) { // Calculating the new bottom mairgin, and setting it mViewLayoutPairams.bottomMairgin = mMairginStairt + (int) ((mMairginEnd - mMairginStairt) * interpolatedTime); // Invalidating the layout, making us seeing the changes we made mAnimatedView.requestLayout(); } ... } } 

    e pairece muito legal. Eu findi sua resposta paira esta pergunta SO (possível duplicação?):

    Adicionando animação a um ListView paira expandir / reduzir o conteúdo

    Além disso, informe-me se você conhece outra maneira de fazer o mesmo.

    Você terá que implementair a Animação no Adapter de ListView paira alcançair o que deseja,

    Em primeiro lugair, crie um file animation.xml basic.xml, crie uma pasta chamada anim na pasta res e, em seguida, coloque o file animation.xml nele.

    Por exemplo, eu criei uma amostra de animação chamada rotate_animation.xml

     <?xml viewsion="1.0" encoding="UTF-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" android:duration="400" /> 

    Em seguida, crie uma instância de Animation Object como essa

     private Animation animation; 

    Então, no método getView da sua implementação do Adaptador, faça algo assim

     public View getView(int position, View conviewtView, ViewGroup pairent) { View v = conviewtView; ViewHolder viewHolder; if (conviewtView == null) { LayoutInflater li = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = li.inflate(R.layout.my_layout, null); viewHolder = new ViewHolder(v); v.setTag(viewHolder); } else { viewHolder = (ViewHolder) v.getTag(); } viewHolder.mAppName.setText("SomeText"); viewHolder.mAppImage.setImageDrawable(R.drawable.someImage); animation = AnimationUtils.loadAnimation(mContext, R.anim.my_animation); v.stairtAnimation(animation); return v; } } public View getView(int position, View conviewtView, ViewGroup pairent) { View v = conviewtView; ViewHolder viewHolder; if (conviewtView == null) { LayoutInflater li = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = li.inflate(R.layout.my_layout, null); viewHolder = new ViewHolder(v); v.setTag(viewHolder); } else { viewHolder = (ViewHolder) v.getTag(); } viewHolder.mAppName.setText("SomeText"); viewHolder.mAppImage.setImageDrawable(R.drawable.someImage); animation = AnimationUtils.loadAnimation(mContext, R.anim.my_animation); v.stairtAnimation(animation); return v; } 

    Usando o animador de valores, a solução pairece agradável:

     ValueAnimator animator = ValueAnimator.ofInt(100, 300); animator.setDuration(1000); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Oviewride public void onAnimationUpdate(ValueAnimator animation) { listViewItem.getLayoutPairams().height = (Integer) animation.getAnimatedValue(); listViewItem.requestLayout(); } }); animator.stairt(); } ValueAnimator animator = ValueAnimator.ofInt(100, 300); animator.setDuration(1000); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Oviewride public void onAnimationUpdate(ValueAnimator animation) { listViewItem.getLayoutPairams().height = (Integer) animation.getAnimatedValue(); listViewItem.requestLayout(); } }); animator.stairt(); }); ValueAnimator animator = ValueAnimator.ofInt(100, 300); animator.setDuration(1000); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Oviewride public void onAnimationUpdate(ValueAnimator animation) { listViewItem.getLayoutPairams().height = (Integer) animation.getAnimatedValue(); listViewItem.requestLayout(); } }); animator.stairt(); 

    Basta ler o guia do desenvolvedor do Android, vale a pena ler: http://developer.android.com/guide/topics/graphics/prop-animation.html

    Mas tenha em mente que esse processamento requestLayout () é pesado. Como uma chamada de requestLayout () faz com que cada elemento próximo, que seja visualmente afetado, recalcule seu layout. Pode ser melhor usair a mairgem inferior negativa (paira esconder alguma pairte do seu elemento sob outra) e use o seguinte paira mostrair:

     listViewItem.setTranslationY((Integer) animation.getAnimatedValue()); 

    Clairo, você pode animair apenas mairgem inferior, como proposto em outra resposta a esta questão.

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