Android ViewPager、片段、带有图像的ListView OutOfmemoryException

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

我有一个viewpager,使用FragmentPagerAdapter管理3个片段。在其中一个片段中,我有一个保存图像的列表视图。当我在每个片段之间滑动时,我最终会得到OutOfmemoryException(从frag1到frag3滑动大约20次之后),我会在下面包含日志,似乎是位图/图像视图导致了触发outofmemory异常的错误。在我的ListAdapter中,我使用convertview来回收位图

以下是我的零碎活动:

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)