Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Viewpager片段中ExpandableListView的上下滚动会导致内存不足错误_Android_Android Viewpager_Out Of Memory_Expandablelistview_Android Support Library - Fatal编程技术网

Android Viewpager片段中ExpandableListView的上下滚动会导致内存不足错误

Android Viewpager片段中ExpandableListView的上下滚动会导致内存不足错误,android,android-viewpager,out-of-memory,expandablelistview,android-support-library,Android,Android Viewpager,Out Of Memory,Expandablelistview,Android Support Library,ExpandableListView几乎为空。我真的不知道是什么在浪费这么多的记忆。 在剧烈滚动(大约上下滚动60次)后,应用程序停止响应。我做了一些研究,发现这个错误只发生在targetsdkversion8到13之间。版本14及更高版本一切正常。 我的应用程序使用android支持库v4和ViewPagerIndicator作为ViewPager。 这是一个讨厌的bug,还是我的代码有问题 package com.test.test; import android.app.Activity

ExpandableListView几乎为空。我真的不知道是什么在浪费这么多的记忆。 在剧烈滚动(大约上下滚动60次)后,应用程序停止响应。我做了一些研究,发现这个错误只发生在targetsdkversion8到13之间。版本14及更高版本一切正常。 我的应用程序使用android支持库v4和ViewPagerIndicator作为ViewPager。 这是一个讨厌的bug,还是我的代码有问题

package com.test.test;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;

import com.viewpagerindicator.TabPageIndicator;

public class MainActivity extends Activity{

    public ExpandableListAdapter mAdapter;  
    final String[] page_titles = new String[]{"page1","page2"}; 


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);    
        setContentView(R.layout.main_activity);

        //Instantiating the adapter
        myAdapter mAdapter = new myAdapter(this);

        //instantiate the Views
        ViewPager mPager = (ViewPager)findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);

        TabPageIndicator mIndicator = (TabPageIndicator)findViewById(R.id.indicator);
        mIndicator.setViewPager(mPager);              
    }

    private class myAdapter extends PagerAdapter{
        Context context;

        public myAdapter(Context c){
            this.context = c;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return page_titles.length;
        }

        @Override
        public boolean isViewFromObject(View v, Object o) {
            // TODO Auto-generated method stub
            return v.equals(o);
        }

        public CharSequence getPageTitle(int position) {
            return page_titles[position];
        }

        public Object instantiateItem(View pager, int position) {
            final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View v = inflater.inflate(R.layout.expander, null, false);
            ExpandableListView elv1 = (ExpandableListView) v.findViewById(R.id.elv1);

            MainActivity.this.mAdapter = new BaseExpandableListAdapter() {

                @Override
                public Object getChild(int groupPosition, int childPosition) {
                    return null;
                }

                @Override
                public long getChildId(int groupPosition, int childPosition) {
                    return 0;
                }

                @Override
                public int getChildrenCount(int groupPosition) {
                    return 1;                                       
                }

                @Override
                public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
                    View v = inflater.inflate(R.layout.childview, null, false);

                    return v;
                }

                @Override
                public Object getGroup(int groupPosition) {
                    return null;
                }

                @Override
                public int getGroupCount() {
                    return 20;
                }

                @Override
                public long getGroupId(int groupPosition) {
                    return 0;
                }

                @Override
                public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
                    View v = inflater.inflate(R.layout.twolinelistitem, parent, false);                                                                                                                                                                                 
                    return v;
                }

                @Override
                public boolean hasStableIds() {
                    return false;
                }

                @Override
                public boolean isChildSelectable(int groupPosition, int childPosition) {
                    return false;
                }
            };
            elv1.setAdapter(MainActivity.this.mAdapter);

            ((ViewPager) pager).addView(v, 0);
            return v;                                   
        }

        @Override
        public void destroyItem(View pager, int position, Object view) {
            ((ViewPager) pager).removeView((View) view);
        }

        @Override
        public void finishUpdate(View view) {
        }

        @Override
        public void restoreState(Parcelable p, ClassLoader c) {
        }

        @Override
        public Parcelable saveState() {
            return null;
        }

        @Override
        public void startUpdate(View view) {
        }

    }



}

对内存非常密集的布局进行膨胀时,您需要找到一种方法来避免对每个列表项进行膨胀,使用视图持有者类,或者仅在分页器为null时进行膨胀

视图持有者的外观如下所示:

private static class ViewHolder {
    public LinearLayout linearLayout;
}
你会像这样存储你的布局

ViewHolder holder = new ViewHolder();
holder.linearLayout = (LinearLayout) convertView.findViewById(R.id.expander);
我使用了你的“只有当寻呼机为空时才充气”解决方案。它就像一个符咒。非常感谢你。如果我的声望更高,我会投赞成票:)