动画不会在当前可见的ListView项目中启动

时间:2013-06-28 10:21:24

标签: android animation

我被困住了,我无法在任何地方找到解决方案。 :(

我的ListView(GridView)的每个项目的布局中都有一个ImageView,由BaseAdapter提供。 加载图像后,我使用

将加载的BitmapDrawable分配给ImageView
imageView.setImageDrawable( newImage );

项目弹出没有任何问题。

但是如果我通过使用TransitionDrawable OR分配新的BitmapDrawable,则通过分配一个简单的动画:

//this is inoperative - animation will not start for currently displayed items! No solution found :(
Animation a = LibResource.getResourceAnimation( activity, R.anim.fade_in );
imageView.setImageDrawable( newImage );
imageView.startAnimation( a );

动画不会启动我的GridView的当前显示项目。 如果我向下滚动GridView并将其滚动回所提到的项目,则会显示图像并执行动画!

我已经尝试了以下修复:

imageView.invalidateDrawable( newImage );
imageView.invalidate();

我在分配动画后也尝试了以下语句 - 当然,我在UI-Thread上调用它们,在分配和启动UI-THREAD上的动画之后:

myGridView.invalidate();
myGridView.invalidateViews();
myGridView.getAdapter().notifyDataSetChanged();

如上所述,此问题仅发生在我的ListView中的可见项目中。

为什么即使在所有涉及的视图上调用invalidate()等之后,Animation或TransitionDrawable也无法启动?

问题出现在我的XPeria-Arc-S(API级别10)和Android-Emulators API级别8,9,10中。这是Android系统中的错误吗?

非常感谢任何帮助!

提前致谢

克里斯托弗


好的 - 谢谢你的快速回复。

我遇到了问题,经过大量时间重新组织我的代码结构才能工作, 我发现这并没有解决我的问题:(。

除此之外,在创建视图时更改内容对我来说不适用或非常实用。也许你有关于这个问题的任何其他解决方案?

此致

克里斯托弗

4 个答案:

答案 0 :(得分:6)

  1. 下次请求视图时,告诉适配器动画视图。
  2. 致电invalidateViews()
  3. 在适配器创建视图上调用getView并为其设置动画。

答案 1 :(得分:1)

我已经解决了这个问题。

如果您尝试将此动画分配给此项目的引用组件,则在当前可见的ListView / GridView项目的视图中启动动画将不起作用。

相反,您必须使GridView无效

myGridView.invalidateViews()

并按照

启动动画

getView()

连接的BaseAdapter的方法。

虽然系统经常调用此方法,但通常使用缓存所有视图的机制。因此,如果要在特定项目中启动动画,只需重新创建视图,下次系统调用myGridView.invalidateViews()后调用getView(),动画就会正常启动!

感谢用户删除了他的有用答案。

问候 克里斯托弗

答案 2 :(得分:0)

这就是我能够解决它的方法。关键是通过发布到GridView的消息队列来通知更改的数据集,以便您的' notifyDataSetChanged'在完成GridView必须完成的所有操作后调用。

myGridView.post(new Runnable() {
  public void run() {
    myGridView.notifyDataSetChanged();
  }
});

答案 3 :(得分:0)

在ListView中添加android:animateLayoutChanges="true"以解决问题。

<ListView
    android:id="@+id/list_view"
    android:animateLayoutChanges="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>