【问题标题】:Endless PageAdapter for ViewPager takes centuries to load a new pageViewPager 的 Endless PageAdapter 需要几个世纪才能加载新页面
【发布时间】: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 页而不避免绘制每一页?

感谢您阅读全文;)。

【问题讨论】:

    标签: android android-viewpager


    【解决方案1】:

    setCurrentItem(int) 使用平滑滚动,这意味着它将滚动浏览所有视图,直到到达您要求的视图,这意味着必须绘制所有视图。

    是不是可以跳过例如 1000 页而不避免绘制每一页?

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

    希望对你有帮助。

    【讨论】:

    • 感谢您的回答。我很抱歉我没有在我的问题上写下来。是的,事实上smoothScroll 等于false,因为我尝试查看每种方法。我要编辑我的问题。感谢您发现它!
    猜你喜欢
    • 2021-09-09
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    相关资源
    最近更新 更多