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.
然后我尝试了不同的方法来添加ccontainer.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;
}
}
}