当前位置: 代码迷 >> Android >> android viewpager outofmemery有关问题解决
  详细解决方案

android viewpager outofmemery有关问题解决

热度:400   发布时间:2016-04-28 00:20:45.0
android viewpager outofmemery问题解决

以前写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的时候,才会去创建视图,这样的写法就不会导致异常了

  相关解决方案