2012-11-15 61 views
17

我正在Android上處理一組數據(ArrayList),該數據填充了ListView。在改變排序模式的時候,我重新排序鏈接到適配器的數據並調用notifyOnDataChanged()來更新列表。動畫列表視圖數據更改

這樣做的工作,但我想能夠動畫每個項目到它的新位置(如在iOS),因爲兩個數據集包含相同的項目 - 只是重新排序。

我花了一些時間思考如何爲此設置動畫,並決定將出現在列表中較低位置的所有項目動畫化爲零高度,然後在新位置將動畫恢復爲其正常大小。這會讓所有在數據中上移的項目實際上移到列表中,因爲項目在其上方消失。這就是這個想法,但我無法弄清楚如何實現它。

的數據可以這樣表示:

Set A | index | Set B 
------+-------+------ 
A  | 0  | B 
B  | 1  | A 
C  | 2  | C 
D  | 3  | F 
E  | 4  | G 
F  | 5  | E 
G  | 6  | D 

我只是在尋找的東西,iOS的處理由默認的Android。它不應該這麼難。

+2

我對此也很感興趣。不僅重新排序,而且動畫添加/刪除。 – goncalossilva

+0

你是否解決了這個問題?我想知道解決方案。請你幫忙? – Nevaeh

回答

11

做了一個小例子,動畫重新排序這樣一個列表。動畫不完全像你描述的那樣,但希望它能幫助你實現你想要的。

https://github.com/fabrantes/widgetexamples

流程是這樣的:

  1. 保存no​​tifyDataSetChanged前的當前狀態()。保存狀態包括存儲每個項目的getTop()座標。
  2. 在notifyDataSetChange之後,遍歷所有ListView視圖並應用具有新項目位置和舊位置之間高度差的TranslateAnimation。
+0

你會如何處理添加/刪除列表?難道它不會攪亂重新排序嗎? – goncalossilva

+0

我真的更喜歡如果這將以ListView子類的形式出現,並且它支持添加/刪除的項目,但是,嘿,謝謝你的努力:-) – goncalossilva

+0

不確定添加/刪除。至於使它成爲一個ListView子類,這應該很容易。創建所述子類並將所需的功能放入其中。然後重寫notifyDataSetChanged並在那裏調用那些函數(小心處理訂單)。 – fabrantes

3

我希望這是解決你的問題

<ListView 
      android:id="@+id/listUniversal" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layoutAnimation="@anim/controller"> 

     </ListView> 

anim.xml

<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android" 
    android:animation="@anim/scale_1" 
    android:delay="50%" /> 

scale_1.xml

<scale 
    android:duration="200" 
    android:fromXScale="0.1" 
    android:fromYScale="0.1" 
    android:pivotX="10%" 
    android:pivotY="10%" 
    android:startOffset="100" 
    android:toXScale="1" 
    android:toYScale="1.0" /> 

+0

將該名稱空間添加到scale元素並且完美! (xmlns:android =「http://schemas.android.com/apk/res/android」)。 – Fer

+0

動畫從列表中刪除項目如何?我怎麼能這樣做? – Fer