优化SchResRanActivity中SectionPagerAdapter的getItem条件逻辑
优化ViewPager Adapter中Fragment创建的冗余代码
嘿,我完全懂你现在的困扰——在SectionPagerAdapter的getItem方法里重复写判断逻辑确实繁琐,尤其是要处理6个标签页的情况。下面给你几个高效的优化思路,让代码更简洁易维护:
1. 封装通用的Fragment创建方法
最直接的方式是把重复的判断逻辑抽成一个单独的方法,这样getItem里只需要调用这个方法即可,彻底避免重复代码:
public class SectionPagerAdapter extends FragmentPagerAdapter { private boolean isRanking; private int daysPassed; // 构造方法、getCount等其他代码... @Override public Fragment getItem(int position) { return createFragmentForPosition(position); } // 封装核心逻辑的私有方法 private Fragment createFragmentForPosition(int position) { // 排名模式下统一返回RankingsFragment if (isRanking) { return RankingsFragment.newInstance(position); // 可按需传递position作为参数 } // 非排名模式下,根据已过天数判断返回对应Fragment return position < daysPassed ? ScheduleFragment.newInstance(position) : new NAFragment(); } }
这种方式的好处是把所有判断逻辑集中在一个地方,后续要调整规则(比如修改daysPassed的判断条件)只需要改这一个方法,不用在getItem里重复修改,维护成本低很多。
2. 用映射关系管理Fragment类型(适合更复杂的场景)
如果每个标签页的基础Fragment类型有差异(比如不是全部默认ScheduleFragment),可以用数组预先定义每个position对应的Fragment类,再结合条件动态调整:
public class SectionPagerAdapter extends FragmentPagerAdapter { private boolean isRanking; private int daysPassed; // 预先定义每个position对应的默认Fragment类(非排名模式) private final Class<? extends Fragment>[] defaultFragmentClasses = new Class[] { ScheduleFragment.class, ScheduleFragment.class, ScheduleFragment.class, ScheduleFragment.class, ScheduleFragment.class, ScheduleFragment.class }; // 构造方法、getCount等其他代码... @Override public Fragment getItem(int position) { if (isRanking) { return RankingsFragment.newInstance(position); } // 根据已过天数选择对应的Fragment类 Class<? extends Fragment> targetClass = position < daysPassed ? defaultFragmentClasses[position] : NAFragment.class; // 通过反射创建实例(如果需要传递参数,建议用newInstance静态方法) try { return targetClass.getDeclaredConstructor().newInstance(); // 若需要传参: // return targetClass.getMethod("newInstance", int.class).invoke(null, position); } catch (Exception e) { e.printStackTrace(); return new NAFragment(); // 兜底返回默认Fragment } } }
这种方式扩展性更强,比如后续要修改某个标签页的默认Fragment,只需要修改defaultFragmentClasses数组即可,不用动判断逻辑。
3. 额外建议:迁移到ViewPager2(如果可行)
如果你的项目还没锁定用旧版ViewPager,建议迁移到ViewPager2,它支持更灵活的FragmentStateAdapter,结合Lambda表达式可以让代码更简洁:
public class SectionPagerAdapter extends FragmentStateAdapter { private boolean isRanking; private int daysPassed; public SectionPagerAdapter(@NonNull FragmentActivity fragmentActivity) { super(fragmentActivity); } @NonNull @Override public Fragment createFragment(int position) { return isRanking ? RankingsFragment.newInstance(position) : (position < daysPassed ? ScheduleFragment.newInstance(position) : new NAFragment()); } @Override public int getItemCount() { return 6; } // 提供方法更新状态,更新后通知Adapter刷新 public void updateState(boolean isRanking, int daysPassed) { this.isRanking = isRanking; this.daysPassed = daysPassed; notifyDataSetChanged(); } }
ViewPager2本身性能更好,支持垂直滑动、RecyclerView的特性,代码也更简洁。
内容的提问来源于stack exchange,提问作者Paris B. G.
相关产品推荐
相关产品推荐

