0

목록보기에서 목록보기 힙 크기를 계속 스크롤하는 동안 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까지 힙이 계속 증가하고 있습니다. 간단한 해결책을 제시하십시오.

+0

또한 logcat을 게시 할 수 있습니까? 내 첫 번째 추측은 convertview를 재활용하지 않고 xml을 늘리는 것입니다. outofmemory 오류가 발생할 수 있습니다. –

+2

당신은 뷰 홀더 방식을 따르지 않았고 모든 것이 메모리에 보관 될 수도 있습니다. –

+0

@Andro Selva 내가 Viewholder 접근법을 사용하려했지만 내보기 모두가 종류가 다르다. listview를 런타임에 listItem을 작성한 다음 ViewHolder approcah를 어떻게 적용해야하는지. – user1551487

답변

1

ListView는 스마트하며 성능을 향상시키기 위해보기를 재활용하는 여러 가지 방법이 있습니다. 이 중 하나는 ViewHolder-pattern을 구현하는 것입니다.

하지만 문제가 해결되지는 않습니다. 당신이 직면 한 문제는 getViewTypeCount() 메서드를 오버라이드하고 엄청난 숫자를 반환한다는 것입니다. ListView은 각 행마다 다른 유형이 있으므로보기를 재생하지 않습니다.

이 방법을 재정의하거나 다른 행 유형의 수를 반환하지 않으면 문제를 해결할 수 있습니다. 즉, 목록에 사용할 수있는 레이아웃이 2 가지라면 당신은 2를 반환합니다.

@Override 
public int getViewTypeCount() { 
    return 2; 
} 
+0

@Martin Van Mierloo 모든보기가 다른 종류 인 경우 viewHolder 방식을 사용해야하는 방법을 제안하십시오. 위의 예제에서 if (condition) attachment.setBackgroundDrawable (attach); else attachment.setBackgroundDrawable (null); 이 경우 ViewHolder가 올바른 결과를 제공하지 않습니다. – user1551487

+1

내가 찾은 최고의 튜토리얼은 [logc.at] (http://logc.at/2011/10/10/handling-listviews-with-multiple-row-types/)입니다. 다른 행을 가진'ListView'를 훌륭하고 깨끗하게 구현했습니다. – DroidBender

+0

@Martijin Van Mierloo 나는 그것을 읽고있다. 비트 맵을 다루는 방법은 없으며, 위의 라이브러리 "android-http-image-manager"는 WeakRefrence 방식을 사용하지 않고 재활용 된 메모리를 지속적으로 사용하는 것처럼 보인다. – user1551487