小编典典

如何动画添加或删除 Android ListView 行

all

在 iOS 中,有一个非常简单且强大的工具来动画 UITableView 行的添加和删除,这是一个来自 youtube
视频的剪辑,
显示了默认动画。请注意周围的行如何折叠到已删除的行上。此动画可帮助用户跟踪列表中的更改以及数据更改时他们在列表中查看的位置。

由于我一直在 Android
上进行开发,因此我发现没有等效的工具可以为TableView中的各个行设置动画。调用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 实现/分支,但这似乎不应该那么困难。

谢谢!


阅读 79

收藏
2022-06-20

共1个答案

小编典典

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>
2022-06-20