在更改方向时,Android活动中的ListView会刷新

12

我有一个Activity,里面嵌套了一个ListView,在Activity的onCreate方法中,我编写了用于填充 ListView 数据的代码,这些数据来自服务器,因此需要调用网络 URL 进行填充。我在同一 Activity 类中拥有 ListView 的 ArrayAdapter。

现在我遇到的问题是,在大多数情况下,我的 Activity 表现得很正常,但是当方向发生变化(从竖屏切换到横屏或者反之)时,数据就会丢失,需要重新调用新的数据来填充相同的旧数据。这不是代码意图中预期的结果,请问应该如何处理?

5个回答

24
Android会在你没有告诉它你将自己处理方向更改的情况下停止并重新启动你的活动。 它这样做是为了让你可以指定不同的资源(如布局),这些资源是特定于方向的(除其他原因外)。
你需要在AndroidManifest.xml中的活动声明中添加android:configChanges="orientation",并且你需要覆盖onConfigurationChanged()。 我认为你不需要在onConfigurationChanged()内做任何特殊的事情,只需实现它即可。

7
我认为你不需要覆盖 onConfigurationChanged() 方法,添加 android:configChanges 属性就足够了。 - Jan S.
1
哇,这是我能想象到的最大的解脱...你不知道你刚刚救了我的命...非常感谢你给我的精彩见解。 - y ramesh rao
说起来,janfsd可能是对的……如果在onConfigurationChanged中没有做任何有用的事情,只需让默认实现完成即可。 - rascalking
当我重写onConfigurationChanged()时,出现了错误。不需要重写,它可以正常工作!谢谢! - Hafizul Amri
1
这是一个懒惰的解决方案!根据文档,"注意:应避免使用此属性,并仅在最后一种情况下使用。" 在这种情况下,这将完美地工作,但当需要不同的布局文件来适应横向视图(大多数情况下)时,这将会引起问题。 - JanithaR
你意识到原始答案是5年前的,当时这是处理这个问题的推荐方式,对吧? - rascalking

13

对于那些面向API 13或更高版本的用户,还应该使用"screenSize"。如果您是这种情况,请添加

android:configChanges="orientation|screenSize"

添加到您的Android清单文件中。

更多信息请点击这里


3
据我所知,在屏幕方向变化时整个Activity都会重新创建!如果您切换到另一个应用程序并稍后返回,则情况也是如此。我建议将数据存储在SharedPreferences中或将其序列化为XML并进行存储。另一种可能性是注册自己的服务,将数据存储在内存中,然后Activity从服务中填充数据。

我认为注册服务是最好的选择,是这样吗? - y ramesh rao
我在哪里可以获取更多关于 Android 服务的信息以满足我的需求? - y ramesh rao

1

似乎这些网站已经消失了。我会寻找另一个例子。 - Moss

1
android:configChanges="orientation|screenSize"

只有当我们没有另一种横屏模式布局时,此代码才会起作用!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接