1

在一个活动中,我正在从服务器检索数据。有限数量的TableRows 包含布局 xml 文件中预定义的更多视图,全部设置为android:visibility="gone". 此外,java 类中有一个数组,其中包含这些TableRows 的所有 ID。对于每个输入的“数据条目”,我填充这样一个TableRow,将其设置为可见并为其设置动画(动画是从随机选择的垂直侧“推入”)。作为进一步的提示,这在本问题后面很重要,从服务器检索的每个数据包都与一个月有关。

每当我获取数据时,我都会执行以下过程

  1. 用信息填充仍然不可见TableRow的s
  2. 每次执行第 1 步时,布尔数组中的一个值被设置为true
  3. 称呼showAnimation()
  4. 对于布尔数组中为真的每个条目,获取id 数组中的TableRow索引i,设置动画并将可见性设置为可见

这工作正常。即使在开始动画之前设置了可见性,也没关系,因为这需要的时间很短,动画在我们眼中已经开始了。

现在问题来了:相反的方式行不通。让我澄清一下:我想要将TableRows 推出窗口,然后设置为不可见的响应。每当我更改实际月份时就消失了,然后将新条目推入。问题是,一旦动画开始,Views 就被设置为不可见/消失。我试图用第一个答案中解释AnimationListener类似方法来解决这个问题。这导致了两种可能的方式:

  1. AnimationListener为每个定义这样一个TableRow并在onAnimationEnd(). 我觉得这很丑陋,因为它不是动态的。
  2. 可以访问 中的一种索引,并为每个的动画AnimationListener设置相同的侦听器。在这里我不知道怎么可能解决这个问题。正如我之前发现的那样,在循环中设置 s 上的动画(在我的情况下为 for 循环)会导致动画在循环完成时启动,而不是在设置时启动。因此,即使我在那个 for 循环中携带一个全局索引变量以在 中使用,它显然也会一事无成。TableRowViewonAnimationEnd()

有人知道实现这一点的更好方法吗?用 a 解决它Handler.postDelayed()并不能解决问题,因为新数据可能已经来自服务器,因此新条目已经可见(因此新条目设置为不可见)。

4

1 回答 1

1

好的,我想了很多,老实说,我同意你的观点,这不是最好的方式,但由于框架的限制,第一种方式仍然是最好的方式。

如果我们可以从侦听器回调中执行以下操作,那就太好了:

public void onAnimationEnd (Animation animation){
    animation.getView().setVisibility(View.Visible);
}
// but this doesn't exist.

只要确保每次设置动画开始执行:

Animation anim = row.getAnimation()
if(anim!=null){
     anim.setListener(null); // to avoid the listener to be called
     anim.cancel(); // to stop it from running
}
// and then go ahead and setup a new animation with new listener
anim = new MyAnimation();
anim.setListener(new SetToInvisibleListener());
row.startAnimation(anim);
于 2013-04-23T15:46:06.503 回答