Android ViewPager、片段、带有图像的ListView OutOfmemoryException
我有一个viewpager,使用FragmentPagerAdapter管理3个片段。在其中一个片段中,我有一个保存图像的列表视图。当我在每个片段之间滑动时,我最终会得到OutOfmemoryException(从frag1到frag3滑动大约20次之后),我会在下面包含日志,似乎是位图/图像视图导致了触发outofmemory异常的错误。在我的ListAdapter中,我使用convertview来回收位图 以下是我的零碎活动:Android ViewPager、片段、带有图像的ListView OutOfmemoryException,android,android-fragments,out-of-memory,Android,Android Fragments,Out Of Memory,我有一个viewpager,使用FragmentPagerAdapter管理3个片段。在其中一个片段中,我有一个保存图像的列表视图。当我在每个片段之间滑动时,我最终会得到OutOfmemoryException(从frag1到frag3滑动大约20次之后),我会在下面包含日志,似乎是位图/图像视图导致了触发outofmemory异常的错误。在我的ListAdapter中,我使用convertview来回收位图 以下是我的零碎活动: public class MainActivity extend
public class MainActivity extends SherlockFragmentActivity implements
ActionBar.TabListener {
SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;
SimpleDateFormat sdf;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mSectionsPagerAdapter = new SectionsPagerAdapter(
getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
actionBar.addTab(actionBar.newTab()
.setText(mSectionsPagerAdapter.getPageTitle(i))
.setTabListener(this));
}
}
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
if (position == 0) {
fragment = new BrowseVidsFragment();
Bundle args = new Bundle();
args.putInt(BrowseVidsFragment.ARG_SECTION_NUMBER, position + 1);
fragment.setArguments(args);
}
if (position == 1) {
fragment = new RecordTodaysVidFragment();
Bundle args = new Bundle();
args.putInt(RecordTodaysVidFragment.ARG_SECTION_NUMBER,
position + 1);
fragment.setArguments(args);
}
if (position == 2) {
fragment = new CompleteVidFragment();
}
return fragment;
}
@Override
public int getCount() {
// Show 3 total pages.
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return getString(R.string.title_section1).toUpperCase();
case 1:
return getString(R.string.title_section2).toUpperCase();
case 2:
return getString(R.string.title_section3).toUpperCase();
}
db = new DBAdapter(MainActivity.this);
return null;
}
}
@Override
public void onResume() {
super.onResume();
Log.d("", "MainActiity onResume()");
}
}
public类MainActivity扩展SherlockFragmentActivity实现
ActionBar.TabListener{
分段SPAGERADAPTER mSectionsPagerAdapter;
ViewPager mViewPager;
简化格式sdf;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
最终ActionBar ActionBar=getSupportActionBar();
actionBar.setNavigationMode(actionBar.NAVIGATION\u MODE\u选项卡);
mSectionsPagerAdapter=新节spageradapter(
getSupportFragmentManager());
mViewPager=(ViewPager)findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager.setOnPageChangeListener(新的ViewPager.SimpleOnPageChangeListener(){
@凌驾
已选择页面上的公共无效(内部位置){
actionBar.setSelectedNavigationItem(位置);
}
});
对于(int i=0;i
下面是包含ListView的片段类,ListView包含ImageView
public class BrowseVidsFragment extends Fragment {
ListView yearsLv, monthsLv, lv;
VidsObject vidsobj;
Spinner spinner1;
TheListAdapter adapter;
ArrayList<String> thumbsToShow;
ArrayList<String> vidsToShow;
ArrayList<String> uniqueMonths;
ArrayList<String> captions;
String selectedYear = "";
String selectedMonth = "";
MyVideoFragment myFragment;
int currentVid = 0;
DBAdapter db;
public static final String ARG_SECTION_NUMBER = "section_number";
public BrowseVidsFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View myFragmentView = inflater.inflate(R.layout.browsevidsfragment,
container, false);
try {
FragmentTransaction fragmentTransaction = getActivity()
.getSupportFragmentManager().beginTransaction();
myFragment = new MyVideoFragment();
fragmentTransaction.add(R.id.myfragment, myFragment);
fragmentTransaction.commit();
lv = (ListView) myFragmentView.findViewById(R.id.list);
} catch (Exception ex) {
ex.getMessage().toString();
}
return myFragmentView;
}
@Override
public void onResume() {
super.onResume();
setLists();
}
public void setLists() {
selectedYear = getCurrentYear();
selectedMonth = getCurrentMonth();
db = new DBAdapter(getActivity());
Toast.makeText(getActivity(), "on resume", 2000).show();
File dir = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath() + "/");
final String[] vids = dir.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".mp4") && !name.contains("temp");
}
});
ArrayList<String> vidslist = new ArrayList<String>();
Arrays.sort(vids);
for (String s : vids) {
String noExtension = s.substring(0, s.length() - 4);
vidslist.add(noExtension + ".jpg");
Log.d("", "added: " + noExtension + ".jpg");
}
captions = new ArrayList<String>();
db.open();
Cursor c = db.getCaptions();
if (c.moveToFirst()) {
while (c.isAfterLast() == false) {
captions.add(c.getString(0));
c.moveToNext();
}
}
c.close();
db.close();
Collections.reverse(captions);
vidsobj = new VidsObject(new ArrayList(Arrays.asList(vids)));
vidsToShow = vidsobj.getAllVids(false);
thumbsToShow = vidsobj.getAllVids(true);
Collections.reverse(vidsToShow);
Collections.reverse(thumbsToShow);
adapter = new TheListAdapter(getActivity(),
vidsToShow.toArray(new String[vidsToShow.size()]),
thumbsToShow.toArray(new String[thumbsToShow.size()]),
captions.toArray(new String[captions.size()]));
lv.setAdapter(adapter);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
myFragment.setVid(String.valueOf(vidsToShow.get(position)
+ ".mp4"));
currentVid = position;
}
});
}
public String getCurrentYear() {
Calendar now = Calendar.getInstance();
return String.valueOf(now.get(Calendar.YEAR));
}
public String getCurrentMonth() {
Calendar now = Calendar.getInstance();
return String.valueOf(now.get(Calendar.MONTH));
}
@Override
public void onPause() {
super.onPause();
Toast.makeText(getActivity(), "onPause()", 200).show();
}
}
公共类BrowseVidsFragment扩展了片段{
列表视图年份lv、月份lv、lv;
VidsObject vidsobj;
喷丝器喷丝器1;
左适配器;
ArrayList thumbsToShow;
ArrayList vidsToShow;
ArrayList唯一月数;
阵列列表标题;
字符串selectedYear=“”;
字符串selectedMonth=“”;
我的视频片段我的片段;
int currentVid=0;
DBAdapter-db;
公共静态最终字符串ARG\u SECTION\u NUMBER=“SECTION\u NUMBER”;
公共浏览器IDSfragment(){
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
查看myFragmentView=充气机。充气(R.layout.browsevidsfragment,
货柜(虚假);;
试一试{
FragmentTransaction FragmentTransaction=getActivity()
.getSupportFragmentManager().beginTransaction();
myFragment=新的MyVideoFragment();
fragmentTransaction.add(R.id.myfragment,myfragment);
fragmentTransaction.commit();
lv=(ListView)myFragmentView.findViewById(R.id.list);
}捕获(例外情况除外){
例如,getMessage().toString();
}
返回myFragmentView;
}
@凌驾
恢复时公开作废(){
super.onResume();
集合列表();
}
公共无效集合列表(){
selectedYear=getCurrentYear();
selectedMonth=getCurrentMonth();
db=新的DBAdapter(getActivity());
Toast.makeText(getActivity(),“在简历上”,2000).show();
File dir=新文件(Environment.getExternalStorageDirectory()
.getAbsolutePath()+“/”;
最终字符串[]vids=dir.list(新文件名过滤器(){
公共布尔接受(文件目录,字符串名称){
返回name.endsWith(“.mp4”)&&!name.contains(“temp”);
}
});
ArrayList vidslist=新的ArrayList();
数组。排序(vids);
用于(字符串s:vids){
字符串noExtension=s.substring(0,s.length()-4);
添加(noExtension+“.jpg”);
Log.d(“,”添加:“+noExtension+”.jpg”);
}
标题=新的ArrayList();
db.open();
游标c=db.getCaptions();
if(c.moveToFirst()){
while(c.isAfterLast()==false)