1

我有一个列表视图,它的数据源来自网络(相当大的列表)。我正在做的是为列表视图项目提供 2 种不同的布局(只需在该列表上移动一些标签以利用横向模式下的视图宽度)。我不想在旋转手机时重新加载我的活动,所以我在清单文件中设置

android:configChanges="orientation"

接下来,我还在我的 Activity 中实现了覆盖方法 onConfigurationChanged() 以帮助我使用新的列表视图项(用于横向模式)更新我的 ListAdapter,如果它在横向(通过检查 newConfiguration.orientation)。我制作了这个 listadapter,调用 notifyDataSetChanged() 并调用 listview.invalidate() 来重新绘制整个 listview。我得到的是一个很大的惊喜:一些项目被更改为新的列表视图项目(在横向模式下),而其他一些列表视图项目没有改变。

我为此花了很多时间,但对此一无所知,请帮助!提前致谢。

4

2 回答 2

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

于 2012-08-02T09:32:07.020 回答
1

android:configChanges="orientation"很多时候不是要走的路,正如我所见,你的情况也是如此。

当我遇到类似问题时,我所做的一个非常简单的修复是返回您的列表视图的数据onRetainNonConfigurationInstance()并通过调用getLastNonConfigurationInstance()在 onCreate 中重新填充您的列表来使用它。你可以做一个空检查(和一个额外的 instanceOf 是安全的)来在从某个地方加载数据之间分叉你的逻辑,或者只是将 getLastNonConfigurationInstance() 转换为你的列表视图的数据变量。

来自我的 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);
...
于 2012-08-02T09:54:46.303 回答