如何在保存viewpager的片段和viewpager的片段(MVP)之间进行通信?

时间:2019-01-09 12:51:22

标签: android kotlin android-viewpager mvp

我正在构建一个mvp应用程序,我正在寻找一种干净,正确的方式在主片段和那些 viewpager的片段之间进行通信。

更具体地说,我有:

  • JobsFragment:包含视图寻呼机的片段
  • NewJobsFragment:视图分页器片段之一
  • RecommendedJobsFragment:viewpager中的第二个片段
  • SavedJobsFragment:viewpager中的第三个片段

所有viewpager的片段都包含一个RecyclerView。每个部分都使用MVP结构( JobsFragment 具有其自己的 JobsPresenter NewJobsFragments 具有 NewJobsPresenter 等)

用户可以过滤每个片段中的作业。可以从 JobsFragment 中选择那些过滤器,当发生这种情况时,我需要从viewpager中“通知”当前片段并将其发送给它。 >

我了解了演示者之间的儿童与父母之间的关系,但我认为这不是一个适当的解决方案。 我还考虑过为所有片段共享一个演示者,但这需要很多代码,我想它不再可读了。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

创建一个扩展Fragment的Abstract Fragment。像这样

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

}

使所有ChildFragment(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;
}

在具有这样的View分页器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();

进行检查