【问题标题】:How to animate individual elements in ListView如何为 ListView 中的单个元素设置动画
【发布时间】:2012-06-05 19:09:08
【问题描述】:

我正在做一个基于 ListView 的小型 Android 应用程序。当用户选择列表中的一个或多个元素并随后从 ActionBar 中选择一个菜单项时,我想对列表中的选定元素做一个小动画,这就是问题所在。

没有任何动画 - 也没有任何失败。以下代码片段是我正在做的事情的简化版本:

private void animateListViewItem()
{
    TranslateAnimation anim = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f,Animation.RELATIVE_TO_SELF, 0.0f,
            Animation.RELATIVE_TO_SELF, -1.0f,Animation.RELATIVE_TO_SELF, 0.0f);
    anim.setDuration(2000);
    View v = fragment.getListAdapter().getView(fragment.getListView().getFirstVisiblePosition(), null, null);
    v.startAnimation(anim);
}

当我弄乱它,试图找出问题所在时,我曾一度用整个 ListView 替换该项目,以排除动画是问题的根源——就像这样。

private void animateListViewItem()
{
    TranslateAnimation anim = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f,Animation.RELATIVE_TO_SELF, 0.0f,
            Animation.RELATIVE_TO_SELF, -1.0f,Animation.RELATIVE_TO_SELF, 0.0f);
    anim.setDuration(2000);
    fragment.getListView().startAnimation(anim);
}

令我惊讶的是,效果很好!

所以我的问题是 - 为什么我不能为 ListView 中的各个元素设置动画?还是我做错了什么?

谢谢!

附:作为记录,ListView 填充了自定义视图(LinearLayouts),并且我在动画之前检查了我是否获得了正确的项目。

【问题讨论】:

  • 抱歉,我对动画或视图操作的经验很少。你有没有试过这个: View v = fragment.getListView().getFirstVisiblePosition();
  • 如果您查看第一个代码示例,这正是我在那里所做的......虽然它为我提供了我正在寻找的视图 - 该视图不会动画 - 而我没有了解原因
  • 很好的第一篇文章(问答)。它们清晰、详细,如果出现错误,您将发布 logcat 跟踪;希望更多的成员和你一样彻底。欢迎使用 Stack Overflow!
  • @Slind 我正在处理同样的问题..你能告诉我这里的片段是什么......你能显示你的代码......

标签: android listview animation


【解决方案1】:

我发现了问题所在:

View v = fragment.getListAdapter().getView(fragment.getListView().getFirstVisiblePosition(), null, null);

这行是问题所在。它返回一个 new View 以在列表中的指定位置显示基础数据,而不是 现有 View。所以返回的View与列表无关。

改为这样做:

View v = fragment.getListView().getChildAt(fragment.getListView().getFirstVisiblePosition());

得到列表正在使用的View 并且动画按预期工作。

【讨论】:

  • 附带说明,这也是我在检查 getX getY 等属性时视图没有任何尺寸的原因。我正在查看虚拟视图,而不是真实视图
  • @Slind 你能告诉我,这里的片段是什么,我应该从哪里调用 animateListViewItem() 方法来为单个项目设置动画
  • @Anshuman 片段只是因为我在片段而不是活动中工作。如果您在 ListActivity 中,只需将 fragment.getListView() 替换为 getListView(),其余部分应该相同。顺便说一句,请记住这是一个简化的示例。由于ListView重用了Views,所以要根据什么View是列表中的FirstVisibleView来调整位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 2021-11-30
  • 1970-01-01
  • 2014-11-22
相关资源
最近更新 更多