我正在构建一个mvp应用程序,我正在寻找一种干净,正确的方式在主片段和那些 viewpager的片段之间进行通信。
更具体地说,我有:
所有viewpager的片段都包含一个RecyclerView。每个部分都使用MVP结构( JobsFragment 具有其自己的 JobsPresenter , NewJobsFragments 具有 NewJobsPresenter 等)
用户可以过滤每个片段中的作业。可以从 JobsFragment 中选择那些过滤器,当发生这种情况时,我需要从viewpager中“通知”当前片段并将其发送给它。 >
我了解了演示者之间的儿童与父母之间的关系,但我认为这不是一个适当的解决方案。 我还考虑过为所有片段共享一个演示者,但这需要很多代码,我想它不再可读了。
提前谢谢!
答案 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();