我有一个listview,其数据源来自Network(相当大的列表)。 我正在做的是为listview项提供2种不同的布局(只需在该列表上移动一些标签以利用横向模式中的视图宽度)。 我不想在旋转手机时重新加载我的活动,所以我在Manifest文件中设置
android:configChanges="orientation"
接下来,我还在我的Activity中实现了覆盖方法onConfigurationChanged(),以帮助我使用新的listview项目(对于横向模式)更新我的ListAdapter,如果它在Landscape中(通过检查newConfiguration.orientation)。 我创建了这个listadapter,调用notifyDataSetChanged()并调用listview.invalidate()来重新绘制整个listview。 我得到的是一个惊喜:一些项目被更改为新的列表视图项目(在横向模式下),而其他一些列表视图项目不会更改。
我花了很多时间来做这件事,对此没有任何线索,请帮忙! 谢谢你提前。
答案 0 :(得分:2)
你可以尝试通过处理程序在onConfigurationChanged()内部做任何事吗?
类似的东西:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
handler.sendEmptyMessageDelayed(1,500);
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(msg.what == 1) {
// do your onConfigurationChanged Stuff
}
}
};
这里我猜你可能需要在onConfigurationChanged之后等待一段时间才能更新你的ListView
答案 1 :(得分:1)
android:configChanges="orientation"
通常不是可行的方式,而且正如我所看到的那样,对你的情况也是如此。
我在遇到类似问题时做的一个非常简单的修复是在onRetainNonConfigurationInstance()
中返回listview的数据,并通过调用getLastNonConfigurationInstance()
来重新填充onCreate中的列表。您可以执行空检查(以及另一个安全的instanceOf)来在从某处加载数据之间分配逻辑,或者只是将getLastNonConfigurationInstance()转换为listview的数据变量。
来自我的onCreate的示例代码:
if (getLastNonConfigurationInstance() == null) {
catalogUpdater.start(); // start background task of populating your list's contents variable, in my case tempItems
} else {
tempItems = (ArrayList<WatchListItem>) getLastNonConfigurationInstance();
watchListAdapter = new WatchListItemBaseAdapter(MyActivity.this, tempItems);
...