以前写viewpager的时候,总是先把view用循环创建出来.然后添加到集合里面,创建adapter的时候,直接把这个集合传递过去,这样的方法一直没什么问题.直到有一天写的一个简单的viewpager却在三星手机中挂掉之后,就开始正视自己了.这样写是不行的,于是有了下面的这些代码:
activity:
package com.bill3g.saferun; import java.util.ArrayList; import java.util.List; import android.R.integer; import android.content.Context; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.widget.ImageView; public class MainActivity extends ActionBarActivity { private Context context; private ViewPager vp_main; private MyPagerAdapter myPagerAdapter; private int[] imageRes = { R.drawable.tab1, R.drawable.tab2, R.drawable.tab3, R.drawable.tab4, R.drawable.tab5, R.drawable.tab6, R.drawable.tab7, R.drawable.tab8, R.drawable.tab9, R.drawable.tab10, R.drawable.tab11, R.drawable.tab12 }; private List<Integer> imageList = new ArrayList<Integer>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = this; initView(); initEvent(); } private void initEvent() { getViewList(); myPagerAdapter = new MyPagerAdapter(context, imageList); vp_main.setAdapter(myPagerAdapter); } private void initView() { vp_main = (ViewPager) findViewById(R.id.vp_main); } private void getViewList() { for (int i = 0; i < imageRes.length; i++) { imageList.add(imageRes[i]); } } }
adapter:
package com.bill3g.saferun; import java.util.List; import android.content.Context; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; public class MyPagerAdapter extends PagerAdapter { private Context context; private List<Integer> list; public MyPagerAdapter(Context context, List<Integer> list) { this.context = context; this.list = list; } // 我们在销毁不必要的视图的时候,就可以直接把object转换成view然后移除,这个object就是instantiateItem的时候,返回的东西 @Override public void destroyItem(ViewGroup container, int position, Object object) { ((ViewPager) container).removeView((View) object); } // 在生成该视图的时候,进行视图的创建,然后设置 @Override public Object instantiateItem(ViewGroup container, int position) { ImageView imageView = new ImageView(context); imageView.setBackgroundResource(list.get(position)); ((ViewPager) container).addView(imageView); return imageView;// 返回我们刚刚添加的那个视图 } @Override public int getCount() { return list.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } }
我们传递的仅仅是资源的地址,然后在生成该view的时候,才会去创建视图,这样的写法就不会导致异常了
时间: 2024-12-18 12:42:23