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

使用ViewPager2批量加载页面时内容重复的问题求助

问题分析与解决方案

不需要设置延迟,所有页面显示相同内容的问题根源是全局变量复用导致的数据覆盖,具体原因和修复方案如下:

问题原因

你在Activity中使用了全局变量dayTitle、focusGroups、dayExercises存储单页数据,循环遍历routineDays时,这些变量会被不断覆盖为当前循环的内容。而DayAdapter的createFragment方法并非在循环时立即执行,而是ViewPager需要创建页面时才会调用,此时这些全局变量已经保留的是最后一次循环的结果,导致所有Fragment拿到的都是同一组数据。

修复步骤

1. 封装单页数据为实体类

创建一个DayData类,用来存储单页所需的所有数据:

public class DayData implements Serializable {
    private String title;
    private List<String> focusGroups; // 替换为你实际的数据类型
    private List<Exercise> dayExercises; // 替换为你实际的数据类型

    public DayData(String title, List<String> focusGroups, List<Exercise> dayExercises) {
        this.title = title;
        this.focusGroups = focusGroups;
        this.dayExercises = dayExercises;
    }

    // 提供getter方法
    public String getTitle() { return title; }
    public List<String> getFocusGroups() { return focusGroups; }
    public List<Exercise> getDayExercises() { return dayExercises; }
}

2. 修改Activity中的数据存储逻辑

移除原来的全局变量,改用List<DayData>存储所有页面的数据,不再依赖NUM_PAGES静态变量:

// 替换原来的全局变量,定义存储所有页面数据的列表
private List<DayData> dayDataList = new ArrayList<>();

// 获取intent中的routine数据
userRoutine = (RoutineISO) getIntent().getSerializableExtra("routine");
ArrayList<String> routineDays = userRoutine.getDays();
Log.i("DEBUG","Printing out days");

// 遍历所有天数,封装数据到列表
for(String day: routineDays){
    List<Exercise> exercises = userRoutine.getSplitDays().get(day);
    List<String> groups = userRoutine.getMuscleGroups().get(day);
    dayDataList.add(new DayData(day, groups, exercises));
    Log.i("DEBUG", exercises.toString());
}

// 初始化Adapter并传入数据列表
pagerAdapter = new DayAdapter(this, dayDataList);
viewPager.setAdapter(pagerAdapter);

3. 修改DayAdapter逻辑

让Adapter持有dayDataList,在createFragment时根据position取出对应页面的数据:

private class DayAdapter extends FragmentStateAdapter {
    private List<DayData> dayDataList;

    public DayAdapter(FragmentActivity fa, List<DayData> dayDataList) {
        super(fa);
        this.dayDataList = dayDataList;
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        DayFragmentISO fragment = new DayFragmentISO();
        DayData dayData = dayDataList.get(position);

        Bundle args = new Bundle();
        args.putString("title", dayData.getTitle());
        args.putBoolean("existing", true);
        args.putSerializable("focusList", (Serializable) dayData.getFocusGroups());
        args.putSerializable("dayExercises", (Serializable) dayData.getDayExercises());
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public int getItemCount() {
        return dayDataList.size();
    }
}

原理说明

通过将每个页面的数据独立存储在列表中,Adapter创建Fragment时可以根据页面位置精准获取对应的数据,避免了全局变量被覆盖导致的所有页面内容一致的问题。这种方式也更符合ViewPager+Fragment的设计逻辑,不需要额外的延迟操作。

内容的提问来源于stack exchange,提问作者Isaiah88

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:43:23