【问题标题】:How to restart Fragment's LoaderManager from hosting Activity?如何从托管 Activity 重新启动 Fragment 的 LoaderManager?
【发布时间】:2016-10-31 21:35:35
【问题描述】:

我有一个带有两个选项卡的 ViewPager 的主要活动。每个选项卡都包含一个片段。

其中一个片段包含一个 RecyclerView 和 FAB,当单击它时会显示一个 DialogFragment,允许用户向 RecyclerView 添加新项目。该片段还实现了 LoaderCallbacks 接口(RecyclerView 数据由 Cursors 支持):

public class MyListFragment extends Fragment
        implements LoaderManager.LoaderCallbacks<Cursor> {

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_list, container, false);

        FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DialogFragment dialog = SaveDialogFragment.newInstance();
                dialog.show(getFragmentManager(), "SaveDialogFragment");
            }
        });

        mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
        ...
        getLoaderManager().initLoader(0, null, this);
        return view;
    }

    ...
}

在这个 DialogFragment 类中,我声明了一个用于回调 Positive 和 Negative 按钮的接口:

public class SaveDialogFragment extends DialogFragment {
    ...
    public interface SaveDialogListener {
        void onSaveDialogPositiveClick(String str1, String str2);
    }
    ...
}

由于我使用 SaveDialogFragment.onAttach() 方法来获取对此 Dialog 宿主的引用,因此我需要在 MainActivity(而不是在片段中)实现 SaveDialogListener:

public class MainActivity extends AppCompatActivity implements SaveDialogFragment.SaveDialogListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        mViewPager = (ViewPager) findViewById(R.id.viewPager);
        setupViewPager(mViewPager);
        TabLayout tabs = (TabLayout) findViewById(R.id.tabs);
        tabs.setupWithViewPager(mViewPager);
    }

    @Override
    public void onSaveDialogPositiveClick(String name, String number) {
        ...
        saveItem(new ItemRow(name, number));
        // HERE I MUST RESET THE LOADER, BUT HOW???
        // getLoaderManager().restartLoader(0, null, ???);
    }
}

总而言之:我从 Fragment 启动 DialogFragment,当用户添加新项目时,此 DialogFragment 会通知宿主 Activity。

我的怀疑来自我在 Fragment 内部使用 LoaderManager 的事实(因为 Fragment 负责初始化 Loader 并重置它)。但是当调用onSaveDialogPositiveClick时,Activity如何重启Fragment的Loader呢? 如何处理这种场景最正确的方法是?

由于 ViewPager 的 Adapter 持有对 Fragments 的引用,因此在 Activity 中保留对 Fragment 的引用只是为了重新启动 LoaderManager 似乎是错误的:

getLoaderManager().restartLoader(0, null, showListFragment);

提前致谢。

【问题讨论】:

    标签: android android-fragments android-dialogfragment android-loadermanager


    【解决方案1】:

    我会这样做, 使用方法创建了一个回调接口 SaveDialogListener。在调用片段 (MyListFragment) 中实现它。在 DialogFragment 创建期间,将调用片段 MyListFragment 设置为目标片段。使用此方法 dialogFrag.setTargetFragment(MyListFragment.this, 0)。现在您可以使用此接口将数据发送到您的片段。

    在您的 DialogFragment 类中,

    SaveDialogListener callback = 
               (SaveDialogListener) getTargetFragment();
    callback. onSaveDialogPositiveClick(param1,param2);
    

    注意:使用 getChildFragmentManager() 来显示 DialogFragment。

    这样您就可以在片段中获得回调。并且可以在那里重新加载loadermanager。

    【讨论】:

      猜你喜欢
      • 2016-12-19
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多