Android Viewpager片段中ExpandableListView的上下滚动会导致内存不足错误
ExpandableListView几乎为空。我真的不知道是什么在浪费这么多的记忆。 在剧烈滚动(大约上下滚动60次)后,应用程序停止响应。我做了一些研究,发现这个错误只发生在targetsdkversion8到13之间。版本14及更高版本一切正常。 我的应用程序使用android支持库v4和ViewPagerIndicator作为ViewPager。 这是一个讨厌的bug,还是我的代码有问题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
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);
我使用了你的“只有当寻呼机为空时才充气”解决方案。它就像一个符咒。非常感谢你。如果我的声望更高,我会投赞成票:)