如何从托管活动重新启动Fragment的LoaderManager?

时间:2016-10-31 21:35:35

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

我有一个带有两个标签的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类的内部,我为正面和负面按钮的回调声明了一个接口:

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会通知托管活动。

我怀疑是因为我在Fragment中使用了一个LoaderManager(因为Fragment负责初始化Loader并重置它)。但是当调用onSaveDialogPositiveClick时,Activity如何重新启动Fragment的Loader? 如何处理这种风景是最正确的方法?

由于ViewPager的适配器保存对Fragments的引用,因此仅在重新启动LoaderManager时保留对该片段的引用似乎是错误的:

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

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

在DialogFragment类中,

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

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

这样您就可以在片段中获得回调。并且可以在那里重装装载机管理员。