ExpandableListViewに展開または折りたたみアニメーションを適用することは可能ですか?
これは、最初は非表示のビューとAnimationを拡張するカスタムクラスを含む単純なListViewを使用して実行できます。基本的な考え方は、View.GONE
から始めて、可視性をView.VISIBLE
に設定しながら、マージンを負の値から必要なサイズに徐々にサイズ変更することです。
見る:
..そして最後に
最後の例には、必要なすべてのコードが含まれています。特に最初にview.bottomMargin = -50
以上を設定する必要があるという事実は、私には少しハックに見えます。そうしないと、アニメーションは最初は正しく機能しませんが、これまでのところ、実行可能な代替手段は見つかりませんでした( ListViewの代わりに独自のコンテナアイテムを使用したScrollView)。
そして最後に、このアプリには、ソースへのリンクを含む他の多くの便利な例の中で、上記の例が含まれています。
更新:Googleは知的財産権侵害の疑いでアプリをPlayストアから削除しました(ただし、デモとオープンソースプロジェクトへのリンクしか含まれていませんでした)が、著者はapkを http://goo.gl/ihcgs 詳細については、 https://plus.google.com/108176685096570584154/posts を参照してください。注意:私は著者とは関係がありません。
単純なリストビューについても同様の作業を行いました。そのために、getViewメソッドをオーバーライドし、各リストアイテムに上(または下)変換アニメーションを適用しました。変換の程度は、リストアイテムの位置によって決定されました。
この問題の可能な(部分的な)回避策を見つけました。
まず、ExpnadableListViewのスクロール状態を保存する必要があります。
@Override
public void onScrollStateChanged(final AbsListView view, final int scrollState) {
this.mScrollState = scrollState;
}
public int getScrollState() {
return this.mScrollState;
}
listView自体については、クリックされたグループを保存して、その子だけがアニメーション化されるようにする必要があります。
mListView.setOnGroupClickListener(...
@Override
public boolean onGroupClick(...){
mGroupPosition=groupPosition;
ここで、getChildView()メソッドで、スクロールの状態を確認し、アイドル状態の場合は、次のようにアニメーションを開始します。
public View getChildView(...) {
// <=prepare rootView and return it later
if (groupPosition==mGroupPosition&&getScrollState() == OnScrollListener.SCROLL_STATE_IDLE)
rootView.setAnimation(...)
これにより、グループを展開するたびに子ビューのアニメーションが設定されます。
これの欠点は次のとおりです。