Android 视图未正确添加到Viewpager,页面滚动出错

Android 视图未正确添加到Viewpager,页面滚动出错,android,android-viewpager,Android,Android Viewpager,我在onpageScrollchange上收到错误indexOutOfBoundException。因为我已经追踪到了错误。在onPageScrollStateChanged 如果我有错误的概念,请纠正我。Viewpager一次可以有两个页面。运行时必须回收两个以上的页面 和onCreateView @Override public View onCreateView(LayoutInflater inflater , ViewGroup container , Bundle s

我在
onpageScrollchange
上收到错误
indexOutOfBoundException
。因为我已经追踪到了错误。在
onPageScrollStateChanged

如果我有错误的概念,请纠正我。Viewpager一次可以有两个页面。运行时必须回收两个以上的页面

和onCreateView

@Override
public View onCreateView(LayoutInflater inflater , ViewGroup container ,
        Bundle savedInstanceState)
{
    getSherlockActivity().setSupportProgressBarIndeterminateVisibility(true);
    View root = inflater.inflate(R.layout.fragment_history_month, container, false);

    // Get first day of week based on locale and populate the day headers
    startDay = Calendar.getInstance().getFirstDayOfWeek();
    final int diff = startDay - Calendar.SUNDAY - 1;
    final int startDay = Utils.getFirstDayOfWeek();

    for (int day = 0; day < 7; day++)
    {
        final String dayString = DateUtils.getDayOfWeekString(
                (DAY_OF_WEEK_KINDS[day] + diff) % 7 + 1, DateUtils.LENGTH_MEDIUM);
        final TextView label = (TextView) root.findViewById(DAY_OF_WEEK_LABEL_IDS[day]);
        label.setText(dayString);
    }

    monthAdapter = new MonthPagerAdapter();
    monthPager = (ViewPager) root.findViewById(R.id.monthpager);

    monthPager.setOffscreenPageLimit(3);

    monthPager.setAdapter(monthAdapter);

    final TitlePageIndicator indicator = (TitlePageIndicator) root.findViewById(R.id.indicator);
    indicator.setFooterColor(getResources().getColor(R.color.primary1));
    indicator.setViewPager(monthPager, 2);
    indicator.setOnPageChangeListener(new IndicatorPageChangeListener(indicator));

    return root;
}
但当OnPageScroll发生时,它会给出
错误索引outofbounderror.

然后我尝试了不同的方法来添加c
container.addView(mv,position);在MonthPagerAdapter上。

MonthPagerAdapter

 private class MonthPagerAdapter extends PagerAdapter implements TitleProvider
    {
        private String[] titles = new String[] { "", "", "" };

        public String[] getTitles()
        {
            return titles;
        }

        public void setTitles(String[] titles)
        {
            this.titles = titles.clone();
        }

        public MonthView addMonthViewAt(ViewPager container , int position , Time time)
        {
            final MonthView mv = new MonthView(HistoryMonthFragment.this);
            mv.setLayoutParams(new ViewSwitcher.LayoutParams(
                    android.view.ViewGroup.LayoutParams.MATCH_PARENT,
                    android.view.ViewGroup.LayoutParams.MATCH_PARENT));
            mv.setSelectedTime(time);

            //container.addView(mv, position);
            //((ViewPager) container).addView(mv, 0);
            container.addView(mv,container.getChildCount()> position ? position : ((ViewPager)container).getChildCount());
            //((ViewPager)collection).addView(layout, ((ViewPager)collection).getChildCount() > position ? position : ((ViewPager)collection).getChildCount())

            return mv;
        }

        @Override
        public void destroyItem(View container , int position , Object object)
        {
            // simply reuse items...
            // ((ViewPager) container).removeViewAt(position);
        }

        @Override
        public int getCount()
        {
            return titles.length;
        }

        @Override
        public String getTitle(int position)
        {
            String title = titles[position];
            return title;
        }

        @Override
        public Object instantiateItem(View container , int position)
        {
            MonthView childAt = (MonthView) ((ViewPager) container).getChildAt(position);

            if (childAt == null)
            {
                final Time time = new Time();
                time.setToNow();

                // set to first day in month. this prevents errors when the
                // current
                // month (TODAY) has more days than the neighbor month.
                time.set(1, time.month, time.year);
                time.month += (position - 1); // add the offset from the center
                                                // time
                time.normalize(true);

                MonthView mv = addMonthViewAt((ViewPager) container, position, time);

                titles[position] = Utils.formatMonthYear(getActivity(), mv.getTime());

                return mv;
            }
            return childAt;
        }

        @Override
        public boolean isViewFromObject(View view , Object object)
        {
            return view == object;
        }

        @Override
        public void restoreState(Parcelable state , ClassLoader loader)
        {
        }

        @Override
        public Parcelable saveState()
        {
            return null;
        }

        @Override
        public void startUpdate(View container)
        {
        }

        boolean alreadyLoaded = false;

        @Override
        public void finishUpdate(View container)
        {
            if (!alreadyLoaded && ((ViewPager) container).getChildCount() == getCount())
            {
                ((HostActivity) getActivity()).getSupportLoaderManager().getLoader(0).forceLoad();
                alreadyLoaded = true;
            }
        }
    }
我认为问题出在他们的某个地方

indicator.setViewPager(monthPager,0)://i have tried for 0,1,2 all are working.
 private class MonthPagerAdapter extends PagerAdapter implements TitleProvider
    {
        private String[] titles = new String[] { "", "", "" };

        public String[] getTitles()
        {
            return titles;
        }

        public void setTitles(String[] titles)
        {
            this.titles = titles.clone();
        }

        public MonthView addMonthViewAt(ViewPager container , int position , Time time)
        {
            final MonthView mv = new MonthView(HistoryMonthFragment.this);
            mv.setLayoutParams(new ViewSwitcher.LayoutParams(
                    android.view.ViewGroup.LayoutParams.MATCH_PARENT,
                    android.view.ViewGroup.LayoutParams.MATCH_PARENT));
            mv.setSelectedTime(time);

            //container.addView(mv, position);
            //((ViewPager) container).addView(mv, 0);
            container.addView(mv,container.getChildCount()> position ? position : ((ViewPager)container).getChildCount());
            //((ViewPager)collection).addView(layout, ((ViewPager)collection).getChildCount() > position ? position : ((ViewPager)collection).getChildCount())

            return mv;
        }

        @Override
        public void destroyItem(View container , int position , Object object)
        {
            // simply reuse items...
            // ((ViewPager) container).removeViewAt(position);
        }

        @Override
        public int getCount()
        {
            return titles.length;
        }

        @Override
        public String getTitle(int position)
        {
            String title = titles[position];
            return title;
        }

        @Override
        public Object instantiateItem(View container , int position)
        {
            MonthView childAt = (MonthView) ((ViewPager) container).getChildAt(position);

            if (childAt == null)
            {
                final Time time = new Time();
                time.setToNow();

                // set to first day in month. this prevents errors when the
                // current
                // month (TODAY) has more days than the neighbor month.
                time.set(1, time.month, time.year);
                time.month += (position - 1); // add the offset from the center
                                                // time
                time.normalize(true);

                MonthView mv = addMonthViewAt((ViewPager) container, position, time);

                titles[position] = Utils.formatMonthYear(getActivity(), mv.getTime());

                return mv;
            }
            return childAt;
        }

        @Override
        public boolean isViewFromObject(View view , Object object)
        {
            return view == object;
        }

        @Override
        public void restoreState(Parcelable state , ClassLoader loader)
        {
        }

        @Override
        public Parcelable saveState()
        {
            return null;
        }

        @Override
        public void startUpdate(View container)
        {
        }

        boolean alreadyLoaded = false;

        @Override
        public void finishUpdate(View container)
        {
            if (!alreadyLoaded && ((ViewPager) container).getChildCount() == getCount())
            {
                ((HostActivity) getActivity()).getSupportLoaderManager().getLoader(0).forceLoad();
                alreadyLoaded = true;
            }
        }
    }