Как связаться между фрагментом, который содержит viewpager и фрагменты viewpager (MVP)? - PullRequest
0 голосов
/ 09 января 2019

Я создаю приложение mvp и ищу чистый и правильный способ связи между основным фрагментом и этими фрагментами viewpager .

Более конкретно, у меня есть:

  • JobsFragment: фрагмент, содержащий пейджер представления
  • NewJobsFragment: один из фрагментов просмотра пейджера
  • RecommendedJobsFragment: 2-й фрагмент из окна просмотра
  • SavedJobsFragment: третий фрагмент из окна просмотра

Все фрагменты ViewPager содержат RecyclerView.Each использует структуру MVP ( JobsFragment имеет свой собственный JobsPresenter , NewJobsFragments имеет NewJobsPresenter и так далее)

Пользователь может фильтровать задания в каждом фрагменте. Эти фильтры можно выбрать из JobsFragment , и когда это происходит, мне нужно «уведомить» текущий фрагмент из окна просмотра и отправить ему эти фильтры.

Я читал о детско-родительских отношениях между докладчиками, но не думаю, что это правильное решение. Я также думаю о совместном использовании одного докладчика для всех фрагментов, но в нем много кода, и я думаю, что он больше не будет читаться.

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

1 Ответ

0 голосов
/ 09 января 2019

Создайте один абстрактный фрагмент, который расширяет фрагмент. как это

   public abstract BaseChildFragment extends Fragment{ 
      public void onViewPagerPagechange(); 

}

Расширяет все дочерние фрагменты (JobsFragment, NewJobsFragment и т. Д.), Расширяет BaseChildFragment,
На вашем адаптере пейджера добавьте следующий код.

LruCache<Integer,BaseChildFragment> cache = new LruCache<>(4);
public BaseChildFragment getBaseChildFragment(int position){
   return cache.get(position);
}

 @Override
public Fragment getItem(int position) {
    if (position == JOB) {
        if (Utility.isEmpty(fragmentProfile)) {
            jobsFragment = JobsFragment .getInstance()
            cache.put(position,fragmentProfile );
        }
        return jobsFragment ;
    } else if (position == NEW_JOB) {
      ......
        return fragment;
    }
    return null;
}

На вашем фрагменте, который имеет вид пейджера AddpageChangeListener, подобный этому

viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {

// optional 
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }

// optional 
@Override
public void onPageSelected(int position) {
 BaseChildFragment fragment =   adapter.getBaseChildFragment(position);
fragmeng.onViewPagerPagechange(); 
//you can invoke presenter logic by calling this method on each child presenter will call your filter (its upto you)
 }
    // optional 
    @Override
    public void onPageScrollStateChanged(int state) { }

});

Это вызовет ваш метод ChildFragment onViewPagerPagechange();. где вы можете загрузить свои дочерние фрагменты. Вы также можете получить выбранный фрагмент. и самый простой способ заключается в том, что вы можете получить текущий фрагмент и проверить с помощью getInstance();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...