gpt4 book ai didi

android - ViewPager 的 Endless PageAdapter 需要几个世纪才能加载新页面

转载 作者:行者123 更新时间:2023-11-30 01:23:34 24 4
gpt4 key购买 nike

我正在尝试实现 Google 日历具有的类似功能。

基本上,我有两种看法:

  • 查看 A)带有日历 CustomViews 的 ViewPager。我们称这个扩展 ViewPager
  • MonthViewPager
  • 观点 B)-- 在 ViewPager 的顶部 -- 一个 Year View,它说明 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);
}

采取这种表现:

enter image description here

我一直在使用 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 中的月份(例如十二月)时,如果您看到我的适配器,我会设置位置 8 + Integer.MAX_VALUE/28 + April

我这样做是这样的:

    int differenceMonths = Utils.differenceMonthsToNow(date);
monthViewPager.setCurrentItem(differenceMonths + Integer.MAX_VALUE / 2, false);

这是性能:

enter image description here

UI 一直被阻塞。

我用 Android Monitor 调试了所有东西,我看到 99.0% 的时间花在了:

ViewPager.setCurrentItem(int item, boolean smoothScroll):

enter image description here

instantiateItem 方法正在调用每个单独的 View 。 (我觉得不应该是这样的,可能是个bug)。

  • 或者,我尝试将所有内容嵌入 Fragment 并通过 FragmentStatePagerAdapter 更改 PageAdapter,但结果非常相似。

我的代码怎么了?是否可以跳过,例如,1000 页而不避免绘制每一页?

感谢您阅读了全部内容;)。

最佳答案

setCurrentItem(int) 使用平滑滚动,这意味着它会滚动所有 View ,直到到达您要求的 View ,这意味着所有 View 都必须被绘制。

Isn't it possible to skip, for example, 1000 pages without avoiding to draw each one?

好吧,这里的解决方案是不使用滚动,setCurrentItem(int, false); 这样 ViewPager 将只绘制该项目并跳过其间的所有项目。

希望对您有所帮助。

关于android - ViewPager 的 Endless PageAdapter 需要几个世纪才能加载新页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36749896/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com