【问题标题】:LoaderManager restartLoader does not work as expected when switching to alternative layout切换到替代布局时,LoaderManager restartLoader 无法按预期工作
【发布时间】:2017-06-16 09:14:28
【问题描述】:

我的应用有一个选择器和一个 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,fragment) 已经被调用了,但是没有任何效果。

如果我以横向模式启动应用程序,一切都很好 - 列表内容已更新。但是改成竖屏后,竖屏的listfragment中的内容并没有更新。

顺便说一句,2个布局文件中的fragment的id相同,@+id/cardlog在res/layout/下,@id/cardlog在res/layout-land/下。这是正确的吗?

【问题讨论】:

    标签: android android-loadermanager


    【解决方案1】:

    我认为您的主要问题是您使用封闭ActivityLoaderManager,同时传入一个子Fragment 作为回调。

    FragmentActivity 有不同的LoaderManager 是有原因的——它们有不同的(并且可能不相关的)生命周期。

    如果你需要有Fragment作为回调,你需要把所有与Loaders相关的代码放到那个Fragment中,并使用它自己的LoaderManager

    【讨论】:

    • 也许我会使用 fragment.getLoaderManager().restartLoader(0, bundle, fragment);直到下周与开发计算机取得联系,我才知道结果。在此先感谢 Vasiliy。
    猜你喜欢
    • 2016-08-17
    • 1970-01-01
    • 2016-11-12
    • 2017-12-11
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    相关资源
    最近更新 更多