为什么我在android-pageradapter中遇到stackoverflow错误?

我只是想膨胀一个xml文件并在viewpager页面中显示它。

LLL

logcat的:

致命exception:在Android.wits.CompoundButton的android.graphics.drawable.DrawableContainer.jumpToCurrentState(DrawableContainer.java:179)上的android.graphics.drawable.BitmapDrawable.setAlpha(BitmapDrawable.java:406)中的主要java.lang.StackOverflowError。 android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)在android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)的android.view.View.jumpDrawablesToCurrentState(ViewGroup.java:5158)上的jumpDrawablesToCurrentState(CompoundButton.java:319) :5158)在android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)at android位于android.view的android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)的android.view.View.jumpDrawablesToCurrentState(ViewGroup.java:5158)上的.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)。 位于android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)的android.view.jumpDrawablesToCurrentState(ViewGroup.java:5158)上的ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)位于android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup) .java:5158)在android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)的android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)处于android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)在Android.view上的android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)的android.view.View.View.jumpDrawablesToCurrentState(ViewGroup.java:5158)上的android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)。位于android.view.View.View.jumpDrawablesTo的android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)的android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)上的ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158) 位于android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)的android.view.View.jumpDrawablesToCurrentState(ViewGroup.java:5158)上的CurrentState(ViewGroup.java:5158)(ViewGroup.java:5158)ViewGroup.java :5158)在android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)at android位于android.view.ViewGroup的android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)上的.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)位于android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)。 android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.ja)上的android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)的android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)中的jumpDrawablesToCurrentState(ViewGroup.java:5158) va:5158)在Android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)的android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)的android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158) Android.view.View的View.view.jumpDrawablesToCurrentState(ViewGroup.java:5158)android.view.View上的android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)的android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)位于android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)的android.view.View.jumpDrawablesToCurrentState(ViewGroup.java:5158)的.jumpDrawablesToCurrentState(ViewGroup.java:5158)位于android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup。 java:5158)在android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)的android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158)android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5158) android.view。 ViewGr

pageradapter类:

public class pageradapter extends PagerAdapter { Context mContext; LayoutInflater mLayoutInflater; List l = MainActivity.list; ImageLoader mImageLoader; public pageradapter(Context context) { mContext = context; mLayoutInflater = LayoutInflater.from(mContext.getApplicationContext()); } @Override public int getCount() { return 4; } @Override public Object instantiateItem(ViewGroup container, int position) { // View itemView = mLayoutInflater.inflate(R.layout.img, container, false); // ImageLoader mImageLoader = ImageLoader.getInstance(); View view = mLayoutInflater.inflate(R.layout.createnew, container); // ImageView imageView = (ImageView) itemView.findViewById(R.id.imageView3); // mImageLoader.displayImage("http://img.androidcookie.com/android/airtel_4g_hotspot_responsive.jpg", imageView); container.addView(view); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((LinearLayout) object); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } } 

我希望膨胀并在viewpager中显示的xml文件,在所有4个页面中都相同: – >

      

您的instantiateItem()返回ViewPager的容器视图,而不是要进入容器内的项目。

这是inflate inflate()的特殊肮脏,之前可能已经咬了很多:如果你调用inflate(R.layout.createnew, container) ,它会返回容器视图:

返回

膨胀层次结构的根视图。 如果提供了root,则这是根视图 ; 否则它是膨胀的XML文件的根。

(重点部分是我的)

您无法访问已膨胀层次结构的实际根,只能访问已附加新子视图的容器。

在这种情况下, addView()实际上是多余的,因为新的View已经在容器中。 但是,在您的代码中,它会将容器添加到自身。 Android不会检查视图层次结构中的循环,但是在某些时候会出现无限遍历循环(导致StackOverflowError )。

由于instanceItem() 需要返回(子)视图 ,这有点问题:

返回表示新页面的Object。 这不需要是View,但可以是页面的其他容器。

要阻止将新视图添加到容器,请将调用更改为

View view = inflate(R.layout.createnew, container, false) ;

并保持对addView()的调用。 现在需要,因为需要适配器将视图添加到容器 :

适配器负责将视图添加到此处给出的容器中,[…]