为什么ListView没有为正确的项目制作动画?

时间:2013-07-11 15:54:22

标签: android android-listview

我有一个带有 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();

这是一个错误还是我错过了什么?

2 个答案:

答案 0 :(得分:4)

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

DevBytes: ListView Animations

修改

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

DevBytes: Animating ListView Deletion

答案 1 :(得分:2)

从Android“L”开始,有一个名为“RecyclerView”的新类,它应该替换ListView(和GridView),并为您提供更好的动画方式,因为它们是插入/移除。

以下是有关它的链接: http://antonioleiva.com/recyclerview/