Android:ViewPager有100多个片段:如何直接在中间设置位置?

时间:2015-09-17 14:24:40

标签: android android-viewpager

我有一个内部有100多个片段的viewpager。实际上,它代表了一本日记,所以: - 50个首次参赛作品是从今天到今天 - 50天 - 51:今天 - 从52开始是接下来的50天

因此,在开始时,我想直接从第51位(今天)开始,而不是自动加载第一个片段并丢失加载时间。

这是我的适配器: Ps:Defines.SCHEDULE_CALENDAR_AREA = 100

public static class CalendarTimelineAdapter extends CacheFragmentStatePagerAdapter {
    private DateTime mDateTime;
    private int mScrollY;
    private Map mPageReferenceMap = new HashMap();

    public CalendarTimelineAdapter(FragmentManager mgr) {
        super(mgr);
        mDateTime = new DateTime();
    }

    public void setScrollY(int scrollY) {
        mScrollY = scrollY;
    }

    @Override
    public int getCount() {
        return (Defines.SCHEDULE_CALENDAR_AREA);
    }

    @Override
    public Fragment createItem(int position) {
        Fragment fragment = new FRAGMENT();
        return fragment;
    }

    public Fragment getFragment(int position) {
        return (Fragment)mPageReferenceMap.get(position);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);
        mPageReferenceMap.remove(position);
    }

    @Override
    public String getPageTitle(int position) {
        int dayNum = computeDifferenceDays(position);
        DateTime dt = mDateTime;
        if (dayNum == 0)
            return MyApplication.getInstance().getString(R.string.day_today);
        else if (dayNum == -1)
            return MyApplication.getInstance().getString(R.string.day_yesterday);
        else if (dayNum == 1)
            return MyApplication.getInstance().getString(R.string.day_tomorrow);
        else if (dayNum < -1)
            dt = mDateTime.minusDays(Math.abs(dayNum));
        else if (dayNum > 1)
            dt = mDateTime.plusDays(Math.abs(dayNum));
        return DateTimeFormat.forPattern(
                MyApplication.getInstance().getString(R.string.format_tab_date)).print(dt);
    }

    private int computeDifferenceDays(int position) {
        return position - (Defines.SCHEDULE_CALENDAR_AREA/2);
    }

    private long convertToMillisDate(int position) {
        int dayNum = computeDifferenceDays(position);
        if (dayNum < 0)
            return mDateTime.minusDays(Math.abs(dayNum)).getMillis();
        else if (dayNum > 0)
            return mDateTime.plusDays(Math.abs(dayNum)).getMillis();
        else
            return mDateTime.getMillis();
    }
}

1 个答案:

答案 0 :(得分:0)

  

我想直接从第51位(今天)开始

致电setCurrentItem(51)上的ViewPager

  

不自动加载第一个片段

您可以在致电setCurrentItem(51)之前尝试拨打setAdapter()。我认为曾经崩溃ViewPager,但扫描the source code表示它现在可以正常工作。

否则,您正在考虑分叉ViewPager或根本不使用它。

  

并且失去了加载时间

如果在setCurrentItem(51)之前调用setAdapter()不起作用,请为您的片段提供一些额外的智能来识别初始加载与正在进行的操作,并延迟为初始加载低位片段的数据工作负荷。