1

ListView에는 다소 많은 항목 (20 개 이상)이 포함되어 있으며 비트 맵 소스가있는 ImageView입니다. 이 비트 맵은 압축되지 않고 크기는 약 640x480입니다. ListView이 방금로드 될 때 약간의 메모리가 필요하지만 스크롤하면 오류 "Memory exceed VM budjet"이 발생할 수 있습니다. 조각을 다른 조각으로 바꾸면 ListView이 여전히 메모리에 매달려 있습니다. ram/ListView 캐시를 지우려면 어떻게해야합니까?ListView의 내용이 많은 메모리를 차지합니다

는 업데이트 : 별도의 스레드에서

SimpleCursorAdapter.ViewBinder viewBinder = new SimpleCursorAdapter.ViewBinder() { 
     public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
      if (columnIndex == 0) { 
       TextView tv1 = (TextView) view; 
       if (cursor.getInt(4) == 0) 
        tv1.setTextColor(Color.GRAY); 
       else 
        tv1.setTextColor(Color.parseColor("#191919")); 
       tv1.setText(cursor.getString(columnIndex)); 
      } 
      if (columnIndex == 3) { 
       TextView tv1 = (TextView) view; 
       tv1.setText(cursor.getString(columnIndex)); 
      } 
      if (columnIndex == 2) { 
       final ImageView image = (ImageView) view; 
       Bitmap cachedImage = null; 
       try { 
        cachedImage = imageThreadLoader.loadImage(cursor.getString(columnIndex), new ImageThreadLoader.ImageLoadedListener() { 
         public void imageLoaded(Bitmap imageBitmap) { 
          image.setImageBitmap((Bitmap) new SoftReference(imageBitmap).get()); 
         } 
        }); 
       } catch (MalformedURLException mue) { 
        Log.e("Feeds fragment", "Can't load image"); 
       } 
       if (cachedImage != null) { 
        image.setImageBitmap(cachedImage); 
       } else image.setImageDrawable(getResources().getDrawable(R.drawable.icon)); 
      } 

이미지로드 :

은 내가 SimpleCursorAdapterViewBinder와 함께 사용합니다.

+0

목록보기가 좋지 않을 수도 있습니다. – ingsaurabh

+0

무엇을 의미합니까? 어쩌면 – LackOfKnowledge

+0

당신이 일을 더 명확하게 할 getview 메서드를 게시 할 수 있다면 listview는 기본적으로 효율적인 메모리 사용을 위해 뷰를 재활용 함을 의미합니다. – ingsaurabh

답변

2

빌드 같은리스트 뷰는 사용자 정의 어댑터를 확인하고 목록보기

public class InteractiveArrayAdapter extends ArrayAdapter<Model> { 

    private final List<Model> list; 
    private final Activity context; 

    public InteractiveArrayAdapter(Activity context, List<Model> list) { 
     super(context, R.layout.main, list); 
     this.context = context; 
     this.list = list; 
    } 

    static class ViewHolder { 
     protected TextView text; 
     protected CheckBox checkbox; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = null; 
     if (convertView == null) { 
      LayoutInflater inflator = context.getLayoutInflater(); 
      view = inflator.inflate(R.layout.main, null); 
      final ViewHolder viewHolder = new ViewHolder(); 
      viewHolder.text = (TextView) view.findViewById(R.id.listitem_text); 
      viewHolder.checkbox = (CheckBox) view.findViewById(R.id.checkBox1); 
      viewHolder.checkbox 
        .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

         public void onCheckedChanged(CompoundButton buttonView, 
           boolean isChecked) { 
          Model element = (Model) viewHolder.checkbox 
            .getTag(); 
          element.setSelected(buttonView.isChecked()); 

         } 
        }); 
      view.setTag(viewHolder); 
      viewHolder.checkbox.setTag(list.get(position)); 
     } else { 
      view = convertView; 
      ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); 
     } 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.text.setText(list.get(position).getName()); 
     holder.checkbox.setChecked(list.get(position).isSelected()); 
     return view; 
    } 
} 

로 설정이 방법을 시도하고 불필요한 뷰는 재활용되고 excecution 빠르게하고 U는 제거하기를 희망합니다 오류

+0

이 어댑터 onDestroyView를 지워야합니까? – LackOfKnowledge

+0

만약 당신을 사용한다면 어댑터의 생성자에 비트 맵의 ​​목록을 넣어야 할 것이며 조각의 모든 생명주기 동안 램에 저장 될 것입니다. 그러나 필자는 필요한 것을 볼 때 외부 저장소에서 이미지를 메모리에로드하려고합니다 목록 항목 및 목록 표시가 사라질 때 비트 맵을 언로드하십시오 (내가 스크롤 할 때) – LackOfKnowledge

+0

죄송합니다. 아직까지는 아무 것도하지 않았지만 .. 시도해 보겠습니다. 어떤 식 으로든 발견하면 알려 드리겠습니다. – MKJParekh

3

ListViews에 대한 Google IO presentation을 보는 것이 좋습니다. 그것은 메모리 절약 기술을 포함하고 ListViews의 논리를 이해하는 데 도움이되었습니다.

+0

나는 ' 나중에 보지 – LackOfKnowledge