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())