2013-04-08 167 views
40

我有一個可以動態添加或刪除到網格的佈局的GridView。Android:動態更改GridView內容

在iOS中,GridView項目的原生行爲是爲網格中的其他項目滑動到刪除項目的位置,或者在添加新項目時滑動以騰出空間。

但是在Android上,行爲只是爲了即時彈出屏幕上的更改。我嘗試添加自定義動畫使用在GridView的適配器一些技巧,每個getView()調用,但最終導致出現了一些問題,在這裏:

Android GridView loading the 0 indexed item in a later index's slot when data set changes

我想有個人的看法控制動畫,而不是適配器的getView()方法,但最終結果是相同的。

我也嘗試使用GridLayoutAnimationController,像這樣:

Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.grid_item_fadein); 
GridLayoutAnimationController controller = new GridLayoutAnimationController(animation, .2f, .2f); 
mGrid.setLayoutAnimation(controller); 

這適用於所有的GridView內容的初始加載,但該內容的任何變化只是瞬間彈出像它在默認情況下。

我覺得這是一個非常簡單的功能,應該有一個更簡單的方法來做到這一點。我在網上搜索中看到的最好的效果是a library,它激活了GridView中交換網格中的位置的項目,但這不是我正在尋找的內容(在同一個庫中,當通過刪除網格從網格中刪除項目時同樣的瞬間效應,我試圖避免發生)。

因此我也看到了一個常見的答案:「看看APIDemos,有很多例子。」但據我所知,實際上沒有動畫GridView內容更改的示例。

任何幫助表示讚賞,謝謝。

+1

你想添加什麼類型的動畫?添加xml屬性「animateLayoutChanges = true」將爲任何視圖提供一些基本的流體動畫。 – klmprt 2013-04-18 18:33:06

+1

這是我嘗試的第一件事,不幸的是它不工作。 – JMRboosties 2013-04-23 16:04:42

+0

五月,我知道如何制止這個動畫。 – 2016-10-28 11:22:50

回答

7

Chet Haase推出了一個關於如何正確處理ListView動畫的漂亮視頻。基本概念可以應用於GridViews。你可以找到視頻here

如果您正在開發API 1.0+,除非您使用NineOldAndroids,否則將無法使用視頻提到的引用動畫功能(如ViewPropertyAnimator)。

4

我認爲對於AdapterViews來說,ViewGroup的LayoutTransition不起作用。查看源代碼,ViewGroup確保調用addViewremoveView時發生的其他子節點的轉換動畫,但派生的AdapterView不使用這些方法,因爲它依賴於提供視圖的適配器。

上面提到的Chet Haase的視頻是關於爲正在消失的ListView生成一個單獨的子視圖的動畫,而不是動畫化所有其他周圍的子視圖來填充空隙。

而且,如果我對它有所瞭解,GridLayoutAnimationController是關於孩子填充(即首次或完整重新佈局整個列表,從空開始)的交錯動畫,而不是動畫化內聯動畫,在添加或刪除後放置周圍兒童的佈局變化。所以,孩子們是通過淡入,滑入還是旋轉 - 從一開始到最後一次一個地出現。

最後,建議的解決方案:如果您不需要基於適配器的視圖,則可以切換到GridLayout或LinearLayout。這就是animateLayoutChanges="true"的作用,以及'佈局動畫'演示總是使用什麼。 注意LayoutTransition需要最小api級別11.而GridLayout需要api14。

4

在對GridView進行了如.remove() 的任何更改之後,您必須調用mGrid.startLayoutAnimation();

GridView不會自動爲你做。你必須手動觸發它;-)