Как перезапустить LoaderManager Fragment из хостинговой активности?

У меня есть основное действие с ViewPager с двумя вкладками. Каждая вкладка содержит фрагмент.

Один из этих фрагментов содержит RecyclerView и FAB, который показывает DialogFragment при нажатии, что позволяет пользователю добавить новый элемент в RecyclerView. Этот фрагмент также реализует интерфейс LoaderCallbacks (данные RecyclerView поддерживаются курсорами):

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() для получения ссылки на хостинг этого диалога, мне нужно реализовать SaveDialogListener в MainActivity (не во фрагменте):

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, ???);
    }
}

Итак, вкратце: я запускаю DialogFragment из фрагмента, и этот DialogFragment уведомляет действие хостинга, когда пользователь добавляет новый элемент.

Мои сомнения связаны с тем, что я использую LoaderManager внутри фрагмента (поскольку фрагмент отвечает за инициализацию загрузчика и его сброс). Но когда вызывается onSaveDialogPositiveClick, как действие может перезапустить загрузчик фрагмента? Как правильнее всего поступить с этим сценарием?

Поскольку адаптер ViewPager содержит ссылку на фрагменты, кажется неправильным сохранять ссылку на фрагмент в действии только для перезапуска LoaderManager:

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

Заранее спасибо.


person mevqz    schedule 31.10.2016    source источник


Ответы (1)


Я бы сделал так, Создал интерфейс обратного вызова SaveDialogListener с методом . Реализуйте его в вызывающем фрагменте (MyListFragment). Во время создания DialogFragment установите вызывающий фрагмент MyListFragment в качестве целевого фрагмента. Используйте этот метод dialogFrag.setTargetFragment(MyListFragment.this, 0). Теперь вы можете использовать этот интерфейс для отправки данных в ваш фрагмент.

В вашем классе DialogFragment

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

Примечание. Используйте getChildFragmentManager(), чтобы отобразить DialogFragment.

Так что вы получите обратный вызов внутри вашего фрагмента. И может перезагрузить loadermanager туда.

person Krish    schedule 31.10.2016