切换到备用布局时,LoaderManager restartLoader无法按预期工作

时间:2017-06-16 09:14:28

标签: android android-loadermanager

我的应用有一个选择器和一个ListFragment。在纵向布局中,微调器用作选择器;在横向中使用列表视图。选择项目后,侦听器将根据所选项目刷新ListFragment的内容。以下是代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_card_logs);
    ...
    spinner = (Spinner)findViewById(R.id.card_name);
    listView = (ListView)findViewById(R.id.card_list);
    if (spinner != null)
        spinner.setOnItemSelectedListener(this);
    if (listView != null) {
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                CardLogFragment.Entity selected = (CardLogFragment.Entity)listView.getAdapter().getItem(position);
                if (selected != null) {
                    Bundle bundle = new Bundle();
                    bundle.putLong(CardLogFragment.CARD_ID, id);
                    CardLogFragment fragment = (CardLogFragment)getFragmentManager().findFragmentById(R.id.cardlog);
   // this does not work after portrait->landscape
                    getLoaderManager().restartLoader(0, bundle, fragment);
   // this always works  
                 CardLogsActivity.this.getSupportActionBar().setTitle(
                            selected.getName()
                    );
                }
            }
        });
    }

@Override
public void onResume() {
    super.onResume();
    ArrayAdapter<CardLogFragment.Entity> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    // populate the adapter
    adapter.add(...);
    adapter.add(...);
    adapter.add(...);
    if (spinner != null) {
        spinner.setAdapter(adapter);
            spinner.setSelection(1);
    }
    else if (listView != null) {
        listView.setAdapter(adapter);
    }
}

当我以纵向模式启动应用程序时,它可以正常工作。我改为横向模式,小部件再次布局得很好。但是,当我单击列表视图的某个项目时,列表内容不会更新,只会更改应用栏的标题。很明显,getLoaderManager()。restartLoader(0,bundle,f ragment)已被调用但没有效果。

如果我在横向模式下启动应用程序,一切都很好 - 列表内容会更新。但是当更改为肖像时,内容不会在肖像的listfragment中更新。

BTW,2个布局文件中的片段具有相同的id,res / layout /下的@ + id / cardlog和res / layout-land /下的@id / cardlog。这是对的吗?

1 个答案:

答案 0 :(得分:1)

我认为您的主要问题是您使用封闭式LoaderManager的{​​{1}},同时传递子Activity作为回调。

FragmentFragment分开Activity的原因 - 它们具有不同(可能不相关)的生命周期。

如果您需要LoaderManager作为回调,则需要将与Fragment相关的所有代码放入Loaders并使用自己的Fragment