Java 当用户到达ViewPager的末尾时,如何动态地将片段添加到ViewPager的开头?

Java 当用户到达ViewPager的末尾时,如何动态地将片段添加到ViewPager的开头?,java,android,dynamic,android-viewpager,fragmentstatepageradapter,Java,Android,Dynamic,Android Viewpager,Fragmentstatepageradapter,我目前有一个基本的ViewPager,它利用FragmentStatePagerAdapter初始化片段 此ViewPager从末尾开始向后滚动(即向左滚动) 当用户接近ViewPager列表的开始时,我希望有更多的项目以编程方式添加到适配器列表的开始,基本上创建一个无限滚动的ViewPager(向左)而不中断用户体验(即,不重新加载当前片段,因为ViewPager已添加片段)。但是,我无法完成此操作 当前,我正在检测适配器的getItem()函数何时通过位置0,用更多项填充适配器使用的列表的开

我目前有一个基本的
ViewPager
,它利用
FragmentStatePagerAdapter
初始化片段

ViewPager
从末尾开始向后滚动(即向左滚动)

当用户接近
ViewPager
列表的开始时,我希望有更多的项目以编程方式添加到适配器列表的开始,基本上创建一个无限滚动的
ViewPager
(向左)而不中断用户体验(即,不重新加载当前片段,因为ViewPager已添加片段)。但是,我无法完成此操作

当前,我正在检测适配器的
getItem()
函数何时通过位置0,用更多项填充适配器使用的列表的开头,然后调用
notifyDataSetChanged()
。但是,发生的情况是位置1处的片段(触发
getItem())
聚焦后立即调用)和0保持在
查看页面的开头,新片段按顺序加载

这是我的
FragmentStatePagerAdapter

class WeekyMoodFragmentAdapter extends FragmentStatePagerAdapter {

    private final int NUM_WEEKS_TO_INITIALIZE = 4;
    private final List<Long> timestampList = new ArrayList<>();
    private final ViewPager mViewPager;

    WeekyMoodFragmentAdapter(FragmentManager fragmentManager, ViewPager viewPager) {
        super(fragmentManager);

        mViewPager = viewPager;
        initializeTimestampList();
    }

    private void initializeTimestampList() {

        DateTime mondayOfThisWeek = new DateTime(System.currentTimeMillis());
        while (mondayOfThisWeek.getDayOfWeek() != DateTimeConstants.MONDAY) {
            mondayOfThisWeek = new DateTime(mondayOfThisWeek.getMillis()
                    - TimeUnit.HOURS.toMillis(DateTimeConstants.HOURS_PER_DAY));
        }

        long weekStartMS = mondayOfThisWeek.withTimeAtStartOfDay().getMillis()
                - TimeUnit.DAYS.toMillis(DateTimeConstants.DAYS_PER_WEEK * NUM_WEEKS_TO_INITIALIZE);

        addTimestampsToList(weekStartMS);
    }

    private void addTimestampsToList(long weekStartMS) {
        for (int i = 0; i < NUM_WEEKS_TO_INITIALIZE; ++i) {
            weekStartMS += TimeUnit.DAYS.toMillis(DateTimeConstants.DAYS_PER_WEEK);

            timestampList.add(i, weekStartMS);
        }
        notifyDataSetChanged();
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = WeeklyMoodFragment.newInstance(timestampList.get(position));
        if (position == 0) {
            addTimestampsToList(timestampList.get(position)
                    - TimeUnit.DAYS.toMillis
                    (DateTimeConstants.DAYS_PER_WEEK * (NUM_WEEKS_TO_INITIALIZE+1)));
        }
        return fragment;
    }

    @Override
    public int getCount() {
        return timestampList.size();
    }
}
ViewPager moodViewPager = (ViewPager) view.findViewById(R.id.weeklyMoodViewPager);

moodViewPager.setAdapter(new WeekyMoodFragmentAdapter(getChildFragmentManager());
moodViewPager.setCurrentItem(moodViewPager.getAdapter().getCount());

您是否考虑过使用
getCount()
返回
Integer.MAX\u VALUE
newInstance
的一种有点老套的方法,它是从
timestampList.get.get(position%timestampList.size())
创建的,并将初始页面
setCurrentItem
设置为
Integer.MAX\u VALUE/2
或最接近的appropiate

@Override
public Fragment getItem(int position) {
    return WeeklyMoodFragment.newInstance(
        timestampList.get(position % timestampList.size()));
        //                         ^  here important
}

@Override
public int getCount() {
    return Integer.MAX_VALUE;
}

    ...

moodViewPager.setCurrentItem(Integer.MAX_VALUE/2);
//or 
WeekyMoodFragmentAdapteradapter = new WeekyMoodFragmentAdapter(getChildFragmentManager());
moodViewPager.setAdapter(adapter);
//dividing integers will round
int roundedCount = (Integer.MAX_VALUE/2) / adapter.getCount();
moodViewPager.setCurrentItem(roundedCount * adapter.getCount())

您是否考虑过使用
getCount()
返回
Integer.MAX\u VALUE
newInstance
的一种有点老套的方法,它是从
timestampList.get.get(position%timestampList.size())
创建的,并将初始页面
setCurrentItem
设置为
Integer.MAX\u VALUE/2
或最接近的appropiate

@Override
public Fragment getItem(int position) {
    return WeeklyMoodFragment.newInstance(
        timestampList.get(position % timestampList.size()));
        //                         ^  here important
}

@Override
public int getCount() {
    return Integer.MAX_VALUE;
}

    ...

moodViewPager.setCurrentItem(Integer.MAX_VALUE/2);
//or 
WeekyMoodFragmentAdapteradapter = new WeekyMoodFragmentAdapter(getChildFragmentManager());
moodViewPager.setAdapter(adapter);
//dividing integers will round
int roundedCount = (Integer.MAX_VALUE/2) / adapter.getCount();
moodViewPager.setCurrentItem(roundedCount * adapter.getCount())