我有一个带有 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();
这是一个错误还是我错过了什么?
答案 0 :(得分:4)
使用ListView
动画更改比设置布局更改标记有点棘手,因为适配器继续进行视图回收。 Chet Haase已经完成了一系列DevBytes文章,解释了这些问题,以及如何在这里正确地完成这类事情。我认为,这可能与您的困境最相关。
修改强>
我在该系列中添加了第二个可能更有帮助的视频,重点是删除,但概念仍然相同。这个技巧的关键是在添加/删除适配器中的元素并添加ViewTreeObserver.OnPreDrawListener
时触发notifyDataSetChanged()
。在适配器更新列表后,侦听器将触发(因此,如果您添加了一个将在屏幕上显示的元素,它现在将具有一个具有位置的视图),但在绘制开始之前,您可以在其中启动动画监听器。请查看9:00左右的相关示例。
答案 1 :(得分:2)
从Android“L”开始,有一个名为“RecyclerView”的新类,它应该替换ListView(和GridView),并为您提供更好的动画方式,因为它们是插入/移除。
以下是有关它的链接: http://antonioleiva.com/recyclerview/