2013-01-04 1 views
1

Android 앱을 사용하고 있습니다. 활동은 각 행에 대해 두 개의 비트 맵을로드합니다. 응용 프로그램은 위아래로 인해 메모리 부족 몇 스크롤 한 후 충돌되는이미지가있는 스크롤 목록의 Android 앱 메모리 부족

예외

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:paddingBottom="@dimen/DefaultMargin" 
    android:paddingTop="@dimen/DefaultMargin" > 


    <TextView 
     android:id="@+id/textViewCourseEmpty" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/empty_course_list_label" 
     android:visibility="gone" /> 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
    </ListView> 

</LinearLayout> 

ListView에 항목이처럼

01-04 12:58:45.328: E/dalvikvm-heap(30264): Out of memory on a 307216-byte allocation. 
    01-04 12:58:45.328: I/dalvikvm(30264): "main" prio=5 tid=1 RUNNABLE 
    01-04 12:58:45.328: I/dalvikvm(30264): | group="main" sCount=0 dsCount=0 obj=0x40c40460 self=0xb3ca38 
    01-04 12:58:45.328: I/dalvikvm(30264): | sysTid=30264 nice=0 sched=0/0 cgrp=default handle=1074541800 
    01-04 12:58:45.328: I/dalvikvm(30264): | schedstat=(14267042000 1117190000 14168) utm=1325 stm=101 core=1 
    01-04 12:58:45.328: I/dalvikvm(30264): at android.graphics.Bitmap.nativeCreate(Native Method) 

그것의 내 주요 활동 아래

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/row" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:orientation="horizontal" 
    android:padding="5dp" > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="match_parent" 
     android:layout_marginLeft="@dimen/DefaultMargin" 
     android:layout_weight="0.65" > 


     <ImageView 
      android:id="@+id/coursestatelogo" 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:src="@drawable/ic_launcher" /> 
    </LinearLayout> 
    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="match_parent" 
     android:layout_marginRight="@dimen/DefaultMargin" 
     android:layout_weight="0.2" 
     android:gravity="right" > 
     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_weight="1.2" 
      android:gravity="right" > 

      <TextView 
       android:id="@+id/courselabel" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:paddingLeft="@dimen/HalfMargin" 
       android:paddingRight="@dimen/HalfMargin" 
       android:singleLine="false" 
       android:textSize="@dimen/textSize" /> 

     </LinearLayout> 

     <ImageView 
      android:id="@+id/courselogo" 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:src="@drawable/ic_launcher" /> 
    </LinearLayout> 

</LinearLayout> 

어레이 어댑터 코드 :

public class CourseArrayAdapter extends ArrayAdapter<CourseData>{ 

    private final Context context; 
    private final CourseData[] values; 

    public CourseArrayAdapter(Context context, CourseData[] values) { 
     super(context, R.layout.list_course_item, values); 
     this.context = context; 
     this.values = values; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View rowView = inflater.inflate(R.layout.list_course_item, parent, false); 
     TextView textView = (TextView) rowView.findViewById(R.id.courselabel); 
     textView.setText(Farsi.Convert(values[position].Name)); 


     ImageView imageView = (ImageView) rowView.findViewById(R.id.courselogo); 


     ImageView imageViewstate = (ImageView) rowView.findViewById(R.id.coursestatelogo); 




     switch (values[position].State){ 
      case NotStarted : 
       if (values[position].Downloaded) 
        imageViewstate.setImageResource(R.drawable.downloaded); 
       else 
        imageViewstate.setImageResource(R.drawable.download); 
       break; 
      case InProgress : 
       imageViewstate.setImageResource(R.drawable.lesson); 
       break; 
      case Certified : 
       imageViewstate.setImageResource(R.drawable.certificate); 
       break; 
     } 

     return rowView; 
    } 

}

+0

시도() 어댑터는 .. 그것은 – user936414

답변

3

contvertView가 null인지 확인해야합니다. 의 getView에서 convertview를 사용

View rowView; 
if (convertView== null) { 
LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     rowView = inflater.inflate(R.layout.list_course_item, parent, false); 
}else 
rowView = convertView; 
+0

감사 @dev_android 도움이 될 수 있습니다. 내 문제를 부드럽게 해결했다. – babakgh

1

당신은 새로운 하나를 팽창하기 전에, 들어오는 뷰를 재사용 할 수 있는지 여부를 확인해야합니다.

View rowView; 

if (convertView == null) { 
    LayoutInflater inflater = ...; 
    rowView = inflater.inflate(...); 
} else 
    rowView = convertView;