2013-07-11 55 views
2

我有一個ListView與android:animateLayoutChanges =「true」屬性。爲什麼ListView不會爲正確的項目設置動畫?

<ListView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/listView" 
     android:animateLayoutChanges="true" 
     android:layout_gravity="center"/> 

而且我有一個適配器添加和刪除項目列表中,

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, arrrayListOfStrings); 

如果我在末尾添加一個字符串,它以動畫的新項目是名單上的最後一個項目,

arrrayListOfStrings.add("Last item in the list"); 
adapter.notifyDataSetChanged(); 

,但如果我在列表頂部添加新的項目,它在頂部增加了一個新的項目,但動畫的最後一個列表項。

arrrayListOfStrings.add(0,"First item in the list"); 
adapter.notifyDataSetChanged(); 

這是一個錯誤還是我錯過了這裏的東西?

回答

4

使用ListView動畫更改比僅設置佈局更改標誌要複雜一些,因爲適配器繼續進行視圖回收。有一系列DevBytes文章,Chet Haase已經解釋了這些問題以及如何在這裏正確地完成這種類型的事情。我認爲,這可能是與你的困境最相關的一個。

DevBytes: ListView Animations

編輯

我說在那個系列,可能是更有幫助的第二個視頻,重點是刪除,但這個概念仍然是相同的。訣竅的關鍵是在添加/刪除適配器中的元素並觸發notifyDataSetChanged()後立即添加ViewTreeObserver.OnPreDrawListener。在適配器更新列表後,偵聽器將觸發(所以如果添加了一個將在屏幕上顯示的元素,它現在將具有帶有位置的視圖),但在繪製開始之前,您可以開始動畫監聽器。相關示例請查看9點左右。

DevBytes: Animating ListView Deletion

+0

我檢查了鏈接了。他展示了一個刪除它的例子,這很容易,因爲我們得到了我們要刪除的視圖的參考。但是,當我們添加它時,我們沒有得到一個可以容納剛添加的項目的視圖。 – iraSenthil

+0

編輯了更多信息... – Devunwired

2

與Android「L」開始,有一個新的類名爲「RecyclerView」,這是應該更換的ListView(和GridView),併爲您提供一個更好的方法,以動畫的項目,如它們被插入/移除。

這裏有一個鏈接看: http://antonioleiva.com/recyclerview/

相關問題