목록보기에서 목록보기 힙 크기를 계속 스크롤하는 동안 Galaxy S3 장치에서 64MB까지 도달하고 응용 프로그램이 손상됩니다. 위의 코드listview에서 스크롤하는 중 힙 크기
public class GAdapter extends BaseAdapter implements Filterable {
private List<G> list;
private GActivity mContext;
private Drawable attach , text;
private HttpImageManager mHttpImageManager;
private LayoutInflater mInfalotar;
public GAdapter(GActivity context , List<G> list){
this.list = list;
mContext = context;
mInfalotar = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mHttpImageManager = ((GApplication)context.getApplication()).getHttpImageManager();
attach = mContext.getResources().getDrawable(R.drawable.ic_attachment);
text = mContext.getResources().getDrawable(R.drawable.ic_text);
}
public void addContact(VamooseGroup entry){
list.add(entry);
notifyDataSetChanged();
}
public void setGroupList(List<G> g){
list.clear();
datavalues = null;
list.addAll(g);
notifyDataSetChanged();
}
@Override
public int getCount(){
return (list.size()+1);
}
@Override
public Object getItem(int index) {
if(index != list.size())
return list.get(index);
else
return null;
}
@Override
public long getItemId(int index) {
return index;
}
@Override
public int getViewTypeCount() {
return list.size()+1;
}
@Override
public int getItemViewType(int position) {
return position == list.size() ? 1 : 0;
}
@Override
public View getView(int index, View convertview, ViewGroup viewGroup) {
int type = getItemViewType(index);
switch(type){
case 0 :
convertview = mInfalotar.inflate(R.layout.data_listitem , viewGroup, false);
ImageView myimageView = (ImageView)convertview.findViewById(R.id.myImage);
TextView groupname = (TextView)convertview.findViewById(R.id.groupname);
TextView timespam = (TextView)convertview.findViewById(R.id.timeInfo);
TextView msgSender = (TextView)convertview.findViewById(R.id.msgowner);
TextView draft = (TextView)convertview.findViewById(R.id.draft);
ImageView watchIcon = (ImageView)convertview.findViewById(R.id.time);
ImageView attachment = (ImageView)convertview.findViewById(R.id.attachment);
final G g = list.get(index);
String grouppic = g.pic();
if(ImageValidator.validate(grouppic)){
Bitmap bitmap = mHttpImageManager.loadImage(new HttpImageManager.LoadRequest(Uri.parse(grouppic), myimageView));
if (bitmap != null && !bitmap.isRecycled()) {
myimageView.setImageBitmap(bitmap);
}
}
parent.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.select));
groupname.setText("FOO1");
msgbox.setText("FOO2");
groupname.setText("F003");
msgSender.setText("F004");
timespam.setText("F005");
attachment.setBackgroundDrawable(attach);
watchIcon.setBackgroundDrawable(text);
break;
}
return convertview;
}
}
사용 목록 - 어댑터입니다. 이미지를 표시하기 위해 다음 라이브러리를 사용하고 있습니다. android-http-image-manager
비트 맵이 재활용되지 않는 이유를 말해 줄 수 있습니까? 목록보기를 스크롤하면서 64MB까지 힙이 계속 증가하고 있습니다. 간단한 해결책을 제시하십시오.
또한 logcat을 게시 할 수 있습니까? 내 첫 번째 추측은 convertview를 재활용하지 않고 xml을 늘리는 것입니다. outofmemory 오류가 발생할 수 있습니다. –
당신은 뷰 홀더 방식을 따르지 않았고 모든 것이 메모리에 보관 될 수도 있습니다. –
@Andro Selva 내가 Viewholder 접근법을 사용하려했지만 내보기 모두가 종류가 다르다. listview를 런타임에 listItem을 작성한 다음 ViewHolder approcah를 어떻게 적용해야하는지. – user1551487