无限的ViewPager

Jon*_*lis 19 android infinite-scroll android-viewpager

这似乎是可能的,但我在确定如何实现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;
    }
Run Code Online (Sandbox Code Playgroud)

我想一次只MonthView在内存中保存3 秒,这样MonthView当用户使用Tab键时,在每个数据库中显示数据都没有太大的延迟.因此,每次显示新页面时,我都需要删除一个MonthView并添加一个MonthView.如果有人对同样的功能有更好的想法,我很乐意听到它!

我正在考虑尝试使用FragmentStatePagerAdapter.

Jon*_*lis 8

我能实现这个我用一个小魔术MonthView,我小号PagerAdapterOnPageChangeListener,以及与编辑的源代码ViewPager本身.如果有人对我如何实现它感兴趣,请查看源代码或使用特定问题发表评论.


Dan*_*son 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;
    }
};
Run Code Online (Sandbox Code Playgroud)

然后WeekDaysFragment可以轻松地显示从其参数传递的日期开始的一周.