requestLayout() と willChangeBounds()
というわけで、困った時の Stack Overflow 頼み!
こんなん見つけた。
直接 ListView の話ではないのだけど、周りと一緒にアニメーションするにはどうしたら良いか?って感じの話なのかな?
ここで紹介されているコードを使ってみたら思い通りのアニメーションができた!
紹介されてたコードはこんなん。
public static void collapse(final View v) { final int initialHeight = v.getMeasuredHeight(); Animation a = new Animation() { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { if(interpolatedTime == 1){ v.setVisibility(View.GONE); }else{ v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime); v.requestLayout(); } } @Override public boolean willChangeBounds() { return true; } }; // 1dp/ms a.setDuration((int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density)); v.startAnimation(a); }
ただ、セルをアニメーションしながら潰すと、それ以降 View が再使用される時にも潰れたままになってしまい、Adapter#notifyDataSetChanged() した時も潰れたままで表示される。
結果、ListView の見た目的には2つのセルが消えた様に見える。(Dividerが2本表示されているので間に潰れたセルがあるのがわかる。)
上の絵だと、No.5は本当に remove() で消したセル。No.6は潰れた View を使って表示されているので見えていないセル。
そんなわけで、アニメーション終了時に潰れたセルの View を元に戻さなきゃいけないな〜と思ったのだけど、height を元のサイズに戻してみても真っ白いままで内容が表示されない…。
セルのアニメーション後にサイズを元に戻すのはここで行き詰まったので、結局、潰れたセルの View は再度 inflate することにした。