2

我有一个带有android:animateLayoutChanges="true" 属性的 ListView。

<ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listView"
        android:animateLayoutChanges="true"
        android:layout_gravity="center"/>

我有一个适配器可以在列表中添加和删除项目,

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, arrrayListOfStrings);

如果我在最后添加一个字符串,它会为列表中最后一个项目的新项目设置动画,

arrrayListOfStrings.add("Last item in the list");
adapter.notifyDataSetChanged();

但是如果我在列表顶部添加新项目,它会在顶部添加一个新项目,但会为最后一个列表项目设置动画。

arrrayListOfStrings.add(0,"First item in the list");
adapter.notifyDataSetChanged();

这是一个错误还是我在这里遗漏了什么?

4

2 回答 2

4

使用 a 动画更改ListView比仅设置布局更改标志有点棘手,因为适配器会进行视图回收。Chet Haase 已经完成了一系列 DevBytes 文章,解释了这些问题以及如何在此处正确执行此类操作。我认为,这可能与您的困境最相关。

DevBytes:ListView 动画

编辑

我在该系列中添加了第二个视频,可能更有帮助,重点是删除,但概念仍然相同。诀窍的关键是ViewTreeObserver.OnPreDrawListener在适配器和触发器中添加/删除元素后立即添加notifyDataSetChanged()。侦听器将在适配器更新列表后触发(因此,如果您添加了一个将在屏幕上显示的元素,它现在将有一个带有位置的视图),但在绘图开始之前,您可以在其中启动动画听众。查看 9:00 左右的相关示例。

DevBytes:动画 ListView 删除

于 2013-07-11T16:03:19.443 回答
2

从 Android“L”开始,有一个名为“ RecyclerView ”的新类,它应该取代 ListView(和 GridView),并为您提供一种更好的方法来在插入/删除时为项目设置动画。

这是一个关于它的链接:http: //antonioleiva.com/recyclerview/

于 2014-08-04T09:52:08.763 回答