2013-07-29 81 views
0

我嘗試自己實現類似SwipeListView的東西。 因此,我必須在與它們交互時爲ListView項目製作動畫。 我使用ViewPropertyAnimator API這樣做拖動ListView的項目,如當:Android animate()不更新UI

ListView parent_list_view = ...; 
View list_view_item = ...; 
int destination = ...; 
long animation_time = ...; 

list_view_item.animate().translationX(destination).setDuration(animation_time) 
    .setListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      System.out.println("animation ended"); 
      //... 
      parent_list_view.invalidate(); //TODO: this can't be the solution 
     } 
    }); 

不幸的是,這並不正常工作。

沒有行使無效的父ListView,我看不到UI的變化,但在一段時間後在控制檯上得到「動畫結束」輸出。在下一次用戶交互(例如,在屏幕上觸摸)時,該項目直接跳到目標位置(沒有動畫)。 我介紹了使父項無效的行,讓項目在完成動畫後跳到其「目的地」。不過,這不是我想要的行爲。

在我看來,該項目在執行動畫時並未使其本身或父視圖無效。由於這個原因,用戶界面不會更新,我可以看到項目View的舊狀態。在執行任何用戶交互時(例如,觸摸屏幕),視圖會失效並被正確重繪。

我對此問題進行了調查,並且不知道該在哪裏繼續搜索錯誤。我知道,如果沒有所有的代碼,就很難調試這個問題。我很抱歉,但現在提取相關部分將非常困難。儘管如此,對這個問題的所有建議都非常感謝。也許我只是忘了一件傻事......

回答

0
+0

感謝您的幫助。我之前看過視頻,但第二次看到它,給了我一個關於如何爲我的問題實施更好的解決方法的提示。 現在我添加一個[OnPreDrawListener](http://developer.android.com/reference/android/view/ViewTreeObserver.OnPreDrawListener.html)到[ViewTreeObserver](http://developer.android.com/reference/ android/view/ViewTreeObserver.html)我的父ListView。在onPreDraw()方法中,如果任何項目執行動畫,則調用parent.invalidateViews()。 我現在可以看到動畫,但我懷疑它是最佳解決方案。更多的想法? – guru