【发布时间】:2016-04-20 16:30:31
【问题描述】:
我正在尝试实现与 Google 日历类似的功能。
基本上我有两种看法:
-
查看 A)
带有 CustomViews 日历的 ViewPager。我们称之为
MonthViewPager,它扩展了ViewPager -
视图 B)
-- 在 ViewPager 的顶部 -- 一个年视图,它显示了
View A)必须去的月份。我们称之为YearView。
范围:我希望用户能够“无限”滚动所需的月份,并能够从 YearView 切换月份。
我初始化 ViewPager 的方式是这样的:
public MonthViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
this.attrs = attrs;
setAdapter(new EndLessAdapter(Calendar.getInstance()));
setCurrentItem(Integer.MAX_VALUE / 2);
}
采用这种性能:
我一直在用setOffscreenPageLimit(int limit) 交替显示屏幕外处于空闲状态的页面数。我试过 1、3、12...
我的PagerAdapter是这个:
public class EndLessAdapter extends PagerAdapter {
Calendar calendar;
public EndLessAdapter(Calendar calendar) {
this.calendar = calendar;
}
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public CalendarView instantiateItem(ViewGroup collection, int position) {
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + position - Integer.MAX_VALUE/2);
final CalendarView calendarView = new CalendarView(context, attrs);
((ViewPager) collection).addView(calendarView, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
return calendarView;
}
@Override
public void destroyItem(ViewGroup arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView((View) arg2);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == ((View) arg1);
}
@Override
public Parcelable saveState() {
return null;
}
}
但是当我想从YearView 设置一个月(例如12 月)时,如果你看到我的适配器,我设置了8 + Integer.MAX_VALUE / 2 的位置8 + April
我喜欢这样做:
int differenceMonths = Utils.differenceMonthsToNow(date);
monthViewPager.setCurrentItem(differenceMonths + Integer.MAX_VALUE / 2, false);
这就是表演:
UI 一直被阻塞。
我用Android Monitor 调试了所有东西,我发现 99.0% 的时间都在花时间:
ViewPager.setCurrentItem(int item, boolean smoothScroll):
并且instantiateItem 方法正在调用每个视图。 (我认为它不应该是这样的,也许它是一个错误)。
- 或者,我尝试将所有内容嵌入到
Fragment上,并将PageAdapter更改为FragmentStatePagerAdapter,但结果非常相似。
我的代码怎么了?是不是可以跳过例如 1000 页而不避免绘制每一页?
感谢您阅读全文;)。
【问题讨论】: