19

这似乎是可能的,但是我在弄清楚如何实现ViewPager可以无限期分页的过程中遇到了一些麻烦。

我的用例是一次显示一个月的日历,但可以通过分页足够的次数来切换到任何月份。

目前我只是extending PagerAdapter,并且MonthViews像这样添加了3个自定义:

    @Override
    public Object instantiateItem(View collection, int position) {
        final MonthView mv = new MonthView(HistoryMonthActivity.this);
        mv.setLayoutParams(new ViewSwitcher.LayoutParams(
                android.view.ViewGroup.LayoutParams.MATCH_PARENT,
                android.view.ViewGroup.LayoutParams.MATCH_PARENT));
        mv.setSelectedTime(mTime);

        ((DirectionalViewPager) collection).addView(mv, 0);

        return mv;
    }

我想一次只MonthView在内存中保留 3 秒,这样MonthView当用户使用选项卡时,在每次显示我的数据库中的数据时不会有很大的延迟。所以每次显示新页面时,我都需要删除一个MonthView并添加一个MonthView。如果有人对相同的功能有更好的想法,我很想听听!

我正在考虑尝试使用FragmentStatePagerAdapter.

4

2 回答 2

8

MonthView我能够在 my s, my PagerAdapter's 中使用一点魔法来实现这一点OnPageChangeListener,并通过编辑它自己的源代码来实现ViewPager。如果有人对我如何实现它感兴趣,请查看源代码或对特定问题发表评论。

于 2011-09-18T17:06:55.020 回答
6

实际上,我一直在研究各种方法来进行这种“无限”分页,尽管人类对时间的概念是无限的(即使我们有时间的开始和结束的概念),但计算机仍然可以处理在离散。有一个最小和最大时间(可以随着时间的推移进行调整,还记得 Y2K 恐慌的基础吗?)。

无论如何,这个讨论的重点是/应该足以通过实际有限的日期范围来支持相对无限的日期范围。一个很好的例子是 Android 框架的CalendarView实现,以及其中的实现WeeksAdapter。默认的最小日期是 1900 年,默认的最大日期是 2100 年,这应该很容易涵盖今天周围 10 年内任何人使用日历的 99%。

他们在实施中所做的(专注于周)是计算最小日期和最大日期之间的周数。这成为寻呼机中的页数。请记住,寻呼机不需要同时维护所有这些页面(setOffscreenPageLimit(int)),它只需要能够根据页码(或索引/位置)创建页面。在这种情况下,索引是该周距最小日期的周数。使用这种方法,您只需要维护最小日期和页数(到最大日期的距离),然后对于任何页面,您都可以轻松计算与该页面关联的星期。ViewPager不要绕着不支持循环(又名无限分页)的事实跳舞,并试图强迫它表现得像它可以无限滚动一样。

new FragmentStatePagerAdapter(getFragmentManager()) {
    @Override
    public Fragment getItem(int index) {
        final Bundle arguments = new Bundle(getArguments());
        final Calendar temp_calendar = Calendar.getInstance();
        temp_calendar.setTimeInMillis(_minimum_date.getTimeInMillis());
        temp_calendar.setFirstDayOfWeek(_calendar.getStartOfWeek());
        temp_calendar.add(Calendar.WEEK_OF_YEAR, index);
        // Moves to the first day of this week
        temp_calendar.add(Calendar.DAY_OF_YEAR,
                -UiUtils.modulus(temp_calendar.get(Calendar.DAY_OF_WEEK) - temp_calendar.getFirstDayOfWeek(),
                7));
        arguments.putLong(KEY_DATE, temp_calendar.getTimeInMillis());
        return Fragment.instantiate(getActivity(), WeekDaysFragment.class.getName(), arguments);
    }

    @Override
    public int getCount() {
        return _total_number_of_weeks;
    }
};

然后WeekDaysFragment可以轻松地显示从其参数中传递的日期开始的星期。

于 2012-12-26T22:31:14.963 回答