You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:37:51