1. ホーム
  2. アンドロイド

[解決済み】Android ListViewの行の追加・削除をアニメーション化する方法

2022-04-09 20:25:32

質問

iOSでは、UITableViewの行の追加と削除をアニメーション化する、非常に簡単で強力な機能があります。 以下はYoutubeの動画です。 デフォルトのアニメーションを表示します。 削除された行の上に、周囲の行が重なっていく様子にご注目ください。 このアニメーションは、ユーザーがリスト内で何が変更されたのか、そしてデータの変更時にリストのどこを見ていたのかを把握するのに役立ちます。

Androidで開発するようになってから、「CGI」の各行をアニメーション化する機能は、これと同等なものが見つかりませんでした。 テーブルビュー . 呼び出し notifyDataSetChanged() を使用すると、ListView のコンテンツが新しい情報ですぐに更新されます。 データが変更されたときに、新しい行が押し込まれたり、スライドアウトしたりする簡単なアニメーションを表示したいのですが、これを行うためのドキュメントを見つけることができません。 以下のような感じです。 LayoutAnimationController しかし、ListViewにLayoutAnimationControllerを設定した場合( ApiDemoのLayoutAnimation2 が表示された後、アダプタから要素を削除すると、要素がアニメーションで表示されずにすぐに消えてしまいます。

また、以下のように、個々の項目を削除したときにアニメーションさせるようなことも試してみました。

@Override
protected void onListItemClick(ListView l, View v, final int position, long id) {
    Animation animation = new ScaleAnimation(1, 1, 1, 0);
    animation.setDuration(100);
    getListView().getChildAt(position).startAnimation(animation);
    l.postDelayed(new Runnable() {
        public void run() {
            mStringList.remove(position);
            mAdapter.notifyDataSetChanged();
        }
    }, 100);
}

しかし、アニメーションした行を囲む行は notifyDataSetChanged() が呼び出されます。 ListViewは一度要素が配置されるとレイアウトを更新しないようです。

ListViewの実装やフォークを自作することも頭に浮かびましたが、これはそれほど難しいことではなさそうな気がします。

ありがとうございます。

解決方法は?

Animation anim = AnimationUtils.loadAnimation(
                     GoTransitApp.this, android.R.anim.slide_out_right
                 );
anim.setDuration(500);
listView.getChildAt(index).startAnimation(anim );

new Handler().postDelayed(new Runnable() {

    public void run() {

        FavouritesManager.getInstance().remove(
            FavouritesManager.getInstance().getTripManagerAtIndex(index)
        );
        populateList();
        adapter.notifyDataSetChanged();

    }

}, anim.getDuration());

上から下へのアニメーションには :

<set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate android:fromYDelta="20%p" android:toYDelta="-20"
            android:duration="@android:integer/config_mediumAnimTime"/>
        <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
            android:duration="@android:integer/config_mediumAnimTime" />
</set>