【问题标题】:Animation does not start in ListView items that are currently visible动画未在当前可见的 ListView 项目中开始
【发布时间】:2013-06-28 10:21:23
【问题描述】:

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

我的 ListView ( GridView ) 的每个项目的布局内都有一个 ImageView,由 BaseAdapter 提供。 当图像被加载时,我将加载的 BitmapDrawable 分配给 ImageView 使用

imageView.setImageDrawable( newImage );

项目弹出没有任何问题。

但是,如果我通过使用 TransitionDrawable 或通过分配一个简单的动画来分配新的 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 线程上调用了它们,在 UI 线程上分配和启动动画之后:

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

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

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

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

任何帮助将不胜感激!

提前致谢

克里斯托弗


好的 - 感谢您的快速回复。

我遇到了问题,经过大量时间重组我的代码结构以使其正常工作, 我发现这并没有解决我的问题:(。

除此之外,在创建视图时更改内容对我来说不适用或非常实用。或许您对此问题还有其他解决方案?

真诚的

克里斯托弗

【问题讨论】:

    标签: android animation


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

    【讨论】:

      【解决方案2】:

      我已经解决了这个问题。

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

      相反,您必须使 GridView 无效

      myGridView.invalidateViews()

      并在相应的地方启动动画

      getView()

      连接BaseAdapter的方法。

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

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

      问候 克里斯托弗

      【讨论】:

      • 很高兴看到它有帮助,我取消了原来的答案。
      • 非常感谢! :) 我无法立即重组我的所有代码以完成这项工作,因此它没有立即成功,但这绝对是正确的方法! :D
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2015-02-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-18
          • 1970-01-01
          • 1970-01-01
          • 2020-09-09
          • 2010-12-13
          • 1970-01-01
          相关资源
          最近更新 更多