我有一个ViewPager有三个项目.我试图设置ViewPager查看最右边的页面(这将是第二个元素).这是返回IndexOutOfBounds异常,虽然我知道索引应该在边界.这是确切的堆栈:
02-22 12:22:50.256: E/AndroidRuntime(384): FATAL EXCEPTION: main
02-22 12:22:50.256: E/AndroidRuntime(384): java.lang.IndexOutOfBoundsException: index=1 count=0
02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addInArray(ViewGroup.java:2050)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addViewInner(ViewGroup.java:1994)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addViewInLayout(ViewGroup.java:1958)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addViewInLayout(ViewGroup.java:1939)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.ViewPager.addView(ViewPager.java:917)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addView(ViewGroup.java:1828)
02-22 12:22:50.256: E/AndroidRuntime(384): at us.tagverse.pagertest.MasterActivity$PAdapter.instantiateItem(MasterActivity.java:518)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:649)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.ViewPager.populate(ViewPager.java:783)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1016)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.View.measure(View.java:8313)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.View.measure(View.java:8313)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.View.measure(View.java:8313)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.View.measure(View.java:8313)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewRoot.performTraversals(ViewRoot.java:839)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.os.Handler.dispatchMessage(Handler.java:99)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.os.Looper.loop(Looper.java:123)
02-22 12:22:50.256: E/AndroidRuntime(384): at android.app.ActivityThread.main(ActivityThread.java:3683)
02-22 12:22:50.256: E/AndroidRuntime(384): at java.lang.reflect.Method.invokeNative(Native Method)
02-22 12:22:50.256: E/AndroidRuntime(384): at java.lang.reflect.Method.invoke(Method.java:507)
02-22 12:22:50.256: E/AndroidRuntime(384): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-22 12:22:50.256: E/AndroidRuntime(384): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-22 12:22:50.256: E/AndroidRuntime(384): at dalvik.system.NativeStart.main(Native Method)
注意原因是java.lang.IndexOutOfBoundsException:index = 1 count = 0.这意味着页/项的计数是0,我要求的索引是1.这两个都不是真的.这是我打电话给我的ViewPager和请求给定的页面:
ViewPager pager = (ViewPager) findViewById(R.id.ma_viewcontainer);
PAdapter adapter = new PAdapter();
pager.setAdapter(adapter);
pager.setCurrentItem(2);
请注意,此调用不会发生任何错误,并将当前项目正确设置为中间项目(索引1):
ViewPager pager = (ViewPager) findViewById(R.id.ma_viewcontainer);
PAdapter adapter = new PAdapter();
pager.setAdapter(adapter);
pager.setCurrentItem(1);
我在视图寻呼机中有3个项目的数量.这是我的完整的PAdapter类,它扩展了PagerAdapter类:
private class PAdapter extends PagerAdapter implements TitleProvider {
private int COUNT = 3;
private static final int SETTINGS_ACTIVITY = 0;
private static final int MAIN_ACTIVITY = 1;
private static final int FRIEND_LIST_ACTIVITY = 2;
@Override
public int getCount() {
return COUNT;
}
@Override
public Object instantiateItem(View collection, int position) {
LinearLayout layout = new LinearLayout(getApplicationContext());
LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
switch(position) {
case MAIN_ACTIVITY :
layout = (LinearLayout) inflater.inflate(R.layout.main, null, false);
initMainLayout(layout);
break;
case SETTINGS_ACTIVITY :
layout = (LinearLayout) inflater.inflate(R.layout.settings, null, false);
initSettingsLayout(layout);
break;
case FRIEND_LIST_ACTIVITY :
layout = (LinearLayout) inflater.inflate(R.layout.friend_list, null, false);
initFriendListLayout(layout);
break;
}
((ViewPager)collection).addView(layout, position);
return layout;
}
@Override
public void destroyItem(View collection, int position, Object view) {
((ViewPager)collection).removeView((LinearLayout)view);
}
@Override
public boolean isViewFromObject(View v, Object o) {
return v == (LinearLayout)o;
}
@Override
public void finishUpdate(View arg0) {
//no need
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
//no need
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate(View arg0) {
//no need
}
@Override
public String getTitle(int position) {
Resources res = getApplicationContext().getResources();
switch(position) {
case MAIN_ACTIVITY :
return res.getString(R.string.app_name);
case SETTINGS_ACTIVITY :
return res.getString(R.string.settings);
case FRIEND_LIST_ACTIVITY :
return res.getString(R.string.friend_list);
default :
return null;
}
}
}
行((ViewPager)集合).addView(layout,position);导致崩溃.
你可以看到,三个项目.使用参数为0或1的setCurrentItem()可以正常工作,但是2会导致这个奇怪的错误.我已经用尽了想法来解决它…不幸的是,ViewPager驻留在Android的一些未知的水域似乎.如果有人对如何解决这个问题有一些了解,那将是非常感激的.谢谢!
编辑:根据Shereef的建议,我尝试通过collection.getChildCount()记录子计数,得到以下结果:
02-22 15:20:42.274: E/children count(645): count: 0
02-22 15:20:42.454: E/children count(645): count: 1
02-22 15:20:42.594: E/children count(645): count: 2
这很有趣.这告诉我的是,它创建一个空的PagerAdapter,并一次添加一个.对于三个可见视图(中心,左和右),instantiateItem()被调用3次.所以我在instantiateItem()方法中添加了这个代码块:
if(((ViewPager)collection).getChildCount() == 2) {
((ViewPager)collection).setCurrentItem(2);
}
所以只有计数确定为2,它会将页面设置为2(这是一个很难解决的问题,但值得一试).我得到了一个类似的错误堆栈,首先指出:((ViewPager)集合).setCurrentItem(2);然后((ViewPager)集合).addView(layout,position);.
希望这有助于提供一些洞察力.