更改配置(旋转电话)时,Listview项目未正确刷新

时间:2012-08-02 09:16:09

标签: android listview

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

android:configChanges="orientation"

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

我花了很多时间来做这件事,对此没有任何线索,请帮忙! 谢谢你提前。

2 个答案:

答案 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);
...