2013-04-23 23 views
1

在活動中,我從服務器檢索數據。有限數量的TableRow包含預先在佈局xml文件中定義的更多視圖,全部設置爲android:visibility="gone"。此外,在java類中有一個數組,其ID爲TableRow。 對於每個輸入「數據輸入」,我填寫這樣的一個TableRow,將其設置爲可見併爲其設置動畫(動畫是從任意選擇的垂直面「推入」)。作爲進一步的提示,這個問題稍後很重要,從服務器檢索的每個數據包都與一個月有關。爲動態視圖數設置動畫,然後將其設置爲不可見/不存在

每當獲得數據,我以下過程

  1. 與信息
  2. 對於每次執行步驟1的時間填寫該靜止無形TableRow秒,在一個布爾陣列的值設置爲true
  3. 通話showAnimation()
  4. 因爲這是布爾數組中的真實的每個條目中,ID陣列中獲得TableRow索引i,設置動畫,並設置能見度VISI ble

這工作正常。即使在啓動動畫之前設置了可見性,也無所謂,因爲這需要很少的時間,所以動畫已經開始在我們的眼中。

現在出現這個問題:相反的方式不起作用。讓我澄清一下:我想,TableRow被推出窗口,然後設置爲不可見的響應。每當我改變實際的月份時就消失了,並且新的條目被推入然後進入。問題是,動畫一開始,View被設置爲不可見/消失。我試圖通過AnimationListener解決這個問題,就像在第一個答案中解釋爲here一樣。這導致兩種可能的方式:

  1. 定義每個TableRow這樣的AnimationListener並設置在onAnimationEnd()知名度。我覺得這很醜陋,因爲它不是動態的。
  2. 有權訪問AnimationListener中的某種索引,並將每個TableRow的動畫設置爲相同的偵聽器。 這裏我不知道怎麼可能解決這個。正如我之前發現的,在循環中設置動畫View(在我的情況下爲循環)會導致循環結束時啓動動畫,而不是每當它設置時都會啓動動畫。因此,即使我將在onAnimationEnd()中使用的for循環中攜帶全局索引變量,它顯然也不會有任何結果。

有人知道更好的實現方法嗎?用Handler.postDelayed()解決這個問題並不能解決問題,因爲新數據可能已經來自服務器,因此新條目已經可見(因此新條目被設置爲不可見)。

+0

而我我想在這裏給你一個很好的答案。告訴我一些事情,你爲什麼使用Table和TableRows而不是List和一個適配器? – Budius 2013-04-23 15:30:06

+0

因爲我在使用表格設計問題時感覺更自由。 – 2013-04-23 15:39:39

+0

它似乎是一個適配器是最適合來自服務器的可變數據。但是我可以看到一些表格特徵對於視覺部分可能是有趣的。 – Budius 2013-04-23 15:48:52

回答

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); 
相關問題