这似乎有可能,但我在确定如何实现可以无限期翻页的ViewPager
时遇到一些麻烦。
我的用例是针对一次显示一个月的日历,但可以通过分页足够的时间切换到任何月份。
目前我只是extending PagerAdapter
,并添加了3个自定义MonthViews
,如下所示:
@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;
}
我希望一次只在内存中保留3 MonthView
个,这样当用户选中时,每个MonthView
上的数据库显示数据都没有太大的延迟。因此,每次显示新页面时,我都需要删除一个MonthView
并添加一个MonthView
。如果有人对同样的功能有更好的想法,我很乐意听到它!
我正在考虑尝试使用FragmentStatePagerAdapter
。
答案 0 :(得分:8)
我能够在我的MonthView
,PagerAdapter
的{{1}}中使用一点点魔法来实现这一点,并且编辑OnPageChangeListener
的源代码本身。如果有人对我如何实现它感兴趣,check out the source code或对特定问题发表评论。
答案 1 :(得分:6)
实际上,我一直在研究实现这种“无限”分页的各种方法,即使人类的时间概念是无限的(即使我们有一个时间的开始和结束的概念) ,计算机处理离散。有一个最小和最大时间(可以随着时间的推移进行调整,还记得Y2K恐慌的基础吗?)。
无论如何,这个讨论的重点是,通过实际有限的日期范围支持相对无限的日期范围是足够的/应该足够的。一个很好的例子是Android框架的CalendarView
实现,以及其中的WeeksAdapter
。默认的最短日期是1900年,默认的最长日期是2100年,这应该涵盖了今天10年半径范围内任何人日历使用的99%。
他们在实施过程中所做的工作(专注于几周)是计算最小日期和最长日期之间的周数。这将成为寻呼机中的页数。请记住,寻呼机不需要同时维护所有这些页面(setOffscreenPageLimit(int)
),它只需要能够根据页码(或索引/位置)创建页面。在这种情况下,索引是一周从最小日期开始的周数。使用这种方法,您只需要保持最小日期和页数(到最大日期的距离),然后对于任何页面,您都可以轻松计算与该页面关联的周。没有围绕ViewPager
不支持循环(a.k.a无限分页)的事实,并试图强迫它表现得像它可以无限滚动。
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
可以轻松显示从其参数中传递的日期开始的一周。