【问题标题】:Why ListView doesn't animate the right item?为什么 ListView 没有为正确的项目设置动画?
【发布时间】:2013-07-11 15:54:22
【问题描述】:

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

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

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

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

    DevBytes: ListView Animations

    编辑

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

    DevBytes: Animating ListView Deletion

    【讨论】:

    • 我已经检查了那个链接。他展示了一个删除它的示例,这很容易,因为我们得到了我们将要删除的视图的引用。但是当我们添加它时,我们没有得到对包含我们刚刚添加的项目的视图的引用。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      相关资源
      最近更新 更多