在Activity中,我正在从服务器检索数据。有限数量的TableRow
包含在布局xml文件中预先定义的更多视图,所有视图都设置为android:visibility="gone"
。此外,java类中有一个数组,其中包含这些TableRow
的所有ID。
对于每个输入“数据输入”,我填充这样的TableRow
,将其设置为可见并为其设置动画(动画是从随机选择的垂直边“推入”)。作为进一步的提示,这在此问题的后期很重要,从服务器检索的每个数据包都与一个月相关。
每当我获得数据时,我都会执行以下过程
TableRow
true
showAnimation()
TableRow
处获取i
,设置动画并将可见性设置为可见这很好用。即使在开始动画之前设置了可见性,也没关系,因为这需要很少的时间,动画已经在我们的眼中开始了。
现在出现了问题:相反的方法不起作用。让我澄清一下:我想,TableRow
被推出窗外,然后设置为不可见的。每当我更改实际月份时就会消失,然后推入新条目。问题是,动画一开始,View
s就会设置为不可见/消失。我尝试用AnimationListener
解决这个问题,如第一个答案中解释here。这导致了两种可能的方式:
AnimationListener
定义一个TableRow
,并在onAnimationEnd()
中设置可见性。我觉得这很难看,因为它不是动态的。AnimationListener
中的某种索引,并为每个TableRow
的动画设置相同的监听器。 我不知道怎么可能解决这个问题。正如我之前发现的那样,在循环中设置的View
上设置动画(在我的情况下为for循环)会导致动画在循环结束时启动,而不是在设置时。因此,即使我在onAnimationEnd()
中使用for循环中的全局索引变量,它显然也会一无所获。有人知道更好的方法来实现这个吗?使用Handler.postDelayed()
解决它并不起作用,因为新数据可能已经来自服务器,因此新条目已经可见(因此新条目设置为不可见)。
答案 0 :(得分: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);