2013-12-09 150 views
0

我有一個包含多個頁面的活動,每個頁面都包含一個ListView。我正在使用自定義列表項的適配器。每個項目都動畫到列表中:使用動畫動畫列表項目

public View getView(int i, View view, ViewGroup viewGroup) { 
    if (view == null) { 
     v = inflater.inflate(R.layout.list_item, null); 
     doTheThing = true; 
    } 

    //Some random code here 

    if(doTheThing) { 
     Animation animation = AnimationUtils.loadAnimation(a, R.anim.list_item_animation); 
     animation.setStartOffset(i * 60 + 200); 
     v.startAnimation(animation); 
    } 

    return v; 
} 

使用此設置我有兩個問題。第一個是,當我向左或向右滾動兩頁以上動畫重複時,它應該只在第一次打開活動時運行。第二個問題是,如果我快速滾動列表中的某些項目,它們會錯過ocasinally,然後它們會回生。它總是隨機的,當它們全部加載時,它不會再次發生。

我該如何解決這個問題?

回答

1

將「doTheThing」置於convertView是否爲null不會是完全確定性的。

適配器不保證它是否/何時將要回收視圖,以及何時它將提供新的視圖。

當然,您可以保證在列表視圖中查看第一頁視圖的第一頁。但是,適配器可能會決定它突然需要4個視圖而不是3個來保持平滑滾動,在這種情況下,您將獲得view == null,並觸發動畫。

我建議依靠更確定的方式來決定哪些視圖進行動畫處理。例如,在檢索到的第一個視圖的500毫秒內檢索的所有視圖都將是動畫等。

+1

感謝這個想法,我試圖通過在活動中設置一個靜態長變量來保存ListViews, (new Date())。getTime()'然後在ListAdapter中檢查該變量,並將其與當前時間進行比較。如果差異超過1000(這對我所需要的可以),動畫不會執行。在Activity中,我還使用putLong()和getLong()來傳送開始時間,如果活動重新啓動(如更改屏幕方向時)。 – Squeazer

+0

與此問題無關...但您應該避免創建你不需要的對象(new Date()...)。System.currentTimeMillis()將完成同樣的事情。 –