2013-04-08 171 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不会自动为你做。你必须手动触发它;-)