方向更改后的空列表

Empty list after orientation change

首先,我已经看过 this question。在我的场景中,我有一个扩展支持的片段。v4.app.ListFragment。该片段调用自定义适配器。我需要处理将切换到 2 窗格布局的设备上的方向更改。我相信我做的大部分事情都是正确的,因为视图本身会正确更改并且我能够从 savedInstanceState 检索数据。但是,我的列表总是空的。我尝试了链接问题中的推荐答案(调用 setListShown(true)),但出现异常 "Can't be used with a custom content view"。相关代码如下:

@Override
public void onConfigurationChanged(Configuration newConfig){
    super.onConfigurationChanged(newConfig);

    LayoutInflater inflater = LayoutInflater.from(getActivity());
    ViewGroup group = ((ViewGroup) getView());
    group.removeAllViews();
    inflater.inflate(R.layout.activity_message_list, group);  
    if(!messages.isEmpty()){
        mAdapter = new MessageListAdapter(getActivity().getApplicationContext(), messages);
    }
    setListAdapter(mAdapter); 
}

配置更改后永远不会调用适配器的 getView 方法。我还需要做些什么来重新滋润视图?如果您需要查看任何其他代码,请告诉我。

由于您正在创建一个新视图,因此您必须重做您在原始代码段(在 onViewCreated 或其他地方)中所做的所有视图初始化。所以,为了初始化 ListView - 你应该做这样的事情:

View rootView = inflater.inflate(R.layout.activity_message_list, group);  
if(!messages.isEmpty()){
    mAdapter = new MessageListAdapter(getActivity().getApplicationContext(), messages);
}
ListView listView = (ListView) root.findViewById(R.id.<your_list_view_id>;
listView.setAdapter(mAdapter);

请记住,您还必须进行所有其他初始化(创建对视图的引用并创建 onClickListeners 或您正在做的任何其他事情)

有一种方法可以避免在设备方向更改后重新加载应用程序,您只需告诉系统您将自行处理屏幕方向更改事件。 您是否尝试在 Manifest.xml 中的 activity 标签内添加参数 android:configChanges="orientation"?

在 Chaosit 的大量指导下,我能够实现我想要的。我的应用程序有一个导航抽屉 activity,我根据选择交换片段(这是一个主从类型片段)。我添加了 android:configChanges="orientation",这样片段就不会恢复到我在 activity 的 onCreate 方法中所做的默认选择。因此,我删除了该行并进行了调整以将选择存储在 savedInstanceState 包中。一切都像我现在预期的那样工作。