码迷,mamicode.com
首页 > 移动开发 > 详细

android viewpager outofmemery问题解决

时间:2015-06-18 22:18:00      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:

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

android viewpager outofmemery问题解决

标签:

原文地址:http://blog.csdn.net/u010399316/article/details/46551215

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!