欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android 解决ViewPager加载大量图片内存溢出问题

程序员文章站 2024-03-03 22:48:46
1.大家都知道为viewpager构建适配器继承pageradapter,怎么构建就不说了。viewpager会默认加载当前页和当前页的左右两页。一开始当前页是下标0,所以...

1.大家都知道为viewpager构建适配器继承pageradapter,怎么构建就不说了。viewpager会默认加载当前页和当前页的左右两页。一开始当前页是下标0,所以一开始默认加载第0页(指下标,下同)和第1页。当你向右滑动,当前页为第1页时,viewpager会加载第2页,这时一共有3页存在(第0,1,2页)。再向右滑动,当前页为第2页时,会移除第0页,加载第3页,同理向左滑动当前页为第1页时,会移除第3页。这么说应该懂了吧。

知道了上面的原理,就可以让viewpager始终只加载3页的图片。加载是执行instantiateitem(...)方法,移除是执行destroyitem(...)方法,可以在instantiateitem(...)里加载某一页的图片,在destroyitem(...)里回收某一页的图片。附上代码:

2.代码实例:

package com.example.test;
 
import java.util.arraylist;
 
import android.app.activity;
import android.os.bundle;
import android.support.v4.view.pageradapter;
import android.support.v4.view.viewpager;
import android.view.view;
import android.widget.imageview;
 
public class testactivity extends activity{
 
 private viewpager mpager;
 private arraylist<view> views;
 @override
 protected void oncreate(bundle savedinstancestate) {
 super.oncreate(savedinstancestate);
 views=new arraylist<view>();
 views.add(new imageview(this));
 views.add(new imageview(this));
 views.add(new imageview(this));
 views.add(new imageview(this));
 views.add(new imageview(this));
 views.add(new imageview(this));
 views.add(new imageview(this));
 views.add(new imageview(this));
  
 mpager=new viewpager(this);
 mpager.setadapter(new mypageradapter());
 setcontentview(mpager);
 }
 
 class mypageradapter extends pageradapter{
 
 @override
 public void destroyitem(view container, int position, object object) {
  //在此次回收图片
  //........回收代码
  
  //移除页面
  ((viewpager)container).removeview(views.get(position));
 }
 
 @override
 public object instantiateitem(view container, int position) {
  // 在此次加载图片
  //......加载图片代码
  
  //加载页面
  ((viewpager)container).addview(views.get(position), 0);
  return views.get(position);
 }
 
 @override
 public int getcount() {
  // todo auto-generated method stub
  return views.size();
 }
 
 @override
 public boolean isviewfromobject(view arg0, object arg1) {
  // todo auto-generated method stub
  return false;
 }
  
 }
}