0

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

Один из этих фрагментов содержит 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 класса я объявляю интерфейс для обратных вызовов положительных и отрицательных пуговиц:

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 внутри Фрагмента (поскольку Fragment отвечает за инициализацию Loader и его сброс). Но когда вызывается onSaveDialogPositiveClick, как может Activity перезагрузить загрузчик фрагмента? Как самый правильный способ справиться с этим сценарием?

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

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

Спасибо заранее.

ответ

1

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

В классе DialogFragment,

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

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

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

+0

спасибо! он отлично работает – mevqz

 Смежные вопросы

  • Нет связанных вопросов^_^