簡體   English   中英

當用戶到達ViewPager的末尾時,如何動態添加片段以啟動ViewPager?

[英]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_VALUEnewInstance 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM