[英]How do I dynamically add and delete fragments with viewpager2 and fragmentstateadapter?
[英]How do I dynamically add fragments to start of ViewPager as user reaches the end of the ViewPager?
我目前有一個基本的ViewPager
,它利用FragmentStatePagerAdapter
來初始化片段。
此ViewPager
從最后開始向后滾動(即向左滾動)。
當用戶接近ViewPager
列表的開頭時,我希望以編程方式將更多項添加到適配器列表的開頭,實質上創建一個無限可滾動的ViewPager
(向左)而不會破壞用戶的體驗(即不重新加載他們的當前片段作為ViewPager添加了片段)。 但是,我無法做到這一點。
目前,我正在檢測我的適配器的getItem()
函數何時傳遞位置0,填充適配器使用更多項的列表的開頭,然后調用notifyDataSetChanged()
。 但是,發生的情況是位置1處的片段(一旦它進入焦點就會觸發getItem()
調用)並且0保留在ViewPager
的開頭,並且新片段全部無序地加載。
這是我的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
:
ViewPager moodViewPager = (ViewPager) view.findViewById(R.id.weeklyMoodViewPager);
moodViewPager.setAdapter(new WeekyMoodFragmentAdapter(getChildFragmentManager());
moodViewPager.setCurrentItem(moodViewPager.getAdapter().getCount());
你有沒有考慮過getCount()
返回從timestampList.get(position%timestampList.size())
創建的Integer.MAX_VALUE
和newInstance
getCount()
有點hacky的方法? 並將初始頁面setCurrentItem
設置為Integer.MAX_VALUE/2
或最近的appriopiate
@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())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.