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

Ale*_*lav 210 animation android listview

在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);
}
Run Code Online (Sandbox Code Playgroud)

但是,动画行周围的行不会移动位置,直到它们在notifyDataSetChanged()调用时跳转到新位置.一旦放置了元素,ListView就不会更新它的布局.

虽然编写我自己的ListView实现/分支已经超出了我的想法,但这看起来似乎不应该那么困难.

谢谢!

小智 124

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());
Run Code Online (Sandbox Code Playgroud)

从上到下动画使用:

<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>
Run Code Online (Sandbox Code Playgroud)

  • 最好使用`anim.setAnimationListener(new AnimationListener(){...})`而不是使用Handler (70认同)
  • "但是,动画行周围的行不会移动位置,直到调用notifyDataSetChanged()时它们跳转到新位置." 此问题仍然存在于您的解决方案中. (7认同)
  • @MrAppleBR有几个原因.首先,你不是在创建一个不需要的`Handler`.其次,它通过在动画结束时使用内置回调使代码变得更简单.第三,你不知道`Handler`和`Animation`的实现如何在每个平台上运行; 你可能有可能在动画结束前发生延迟的runnable. (5认同)
  • 什么是FavouritesManager类和populateList()方法? (5认同)

dim*_*til 9

看看Google解决方案.这是一种删除方法.

ListViewRemovalAnimation项目代码和视频演示

它需要Android 4.1+(API 16).但我们在外面有2014年.