마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

커스텀 ArrayAdapter를 사용하여 Spinner에 이미지를 표시하는 데 안 보일 때가 있습니다.

0 추천

커스텀 ArrayAdapter를 사용하여 Spinner에 이미지를 표시하는 데 안 보일 때가 있습니다.

코드는 아래와 같습니다.

 

public class AppInfo implements Serializable {
    public byte[] imgData;
    public  String AppName;
    public String PackageName;
 
 
}
 
public class custom_adapter extends ArrayAdapter {
    public ArrayList<AppInfo> m_list;
 
 
    private PackageManager pm;
 
    ALPHA_COMPARATOR _comparator;
 
 
    public custom_adapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
        pm = context.getPackageManager();
        m_list=new ArrayList<AppInfo>();
        _comparator = new ALPHA_COMPARATOR(context);
    }
    public custom_adapter(Context context, int textViewResourceId, String[] objects) {
        super(context, textViewResourceId, objects);
        pm = context.getPackageManager();
        m_list=new ArrayList<AppInfo>();
        _comparator = new ALPHA_COMPARATOR(context);
    }
 
......
 
 
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getCustomView(position, convertView, parent);
    }
 
    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        return getCustomView(position, convertView, parent);
    }
 
    public View getCustomView(int position, View convertView, ViewGroup parent)
    {
        final Context context = parent.getContext();
       
        ImageView img=null;
        TextView text=null;
        Holder holder=null;
 
       if ( convertView == null ) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
           convertView = inflater.inflate(R.layout.custom_item, parent, false);
 
           img = (ImageView) convertView.findViewById(R.id.list_image);
           text = (TextView) convertView.findViewById(R.id.text);
 
 
           holder = new Holder();
           holder.iv=img;
           holder.tv=text;
           convertView.setTag(holder);
       }
       else
       {
           holder=(Holder)convertView.getTag();
           img=holder.iv;
           text=holder.tv;
       }
 
img.setImageBitmap(BitmapFactory.decodeByteArray(m_list.get(position).imgData, 0, m_list.get(position).imgData.length));
text.setText(m_list.get(position).AppName);
 
        return convertView;
    }
 

setImageBitmap 때문에 느려서 일꺼라는 분들도 계셔서 cache를 써 보아도 같은 증상입니다.

하지만 convertView가 null일  때만 하지 않고 항상 

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
           convertView = inflater.inflate(R.layout.custom_item, parent, false);
 
위 함수를 호출해서 converView를 갱신해서 사용하면 이미지는 잘 보이는데 대신 스크롤을 많이 하면 메모리 사용이 계속 증가 하다가 OutOfMemory가 발생합니다.
 
제가 찾아본 바로는 convertView는 안 보일 때만 null이고 보이는 부분은 기존 값을 유지않다고 들었는데 아닌가요?
어디가 잘못 된 것이지 잘 이해가 안 갑니다.
 
고수님들의 가르침을 부탁드립니다. 
궁금이5 (740 포인트) 님이 2015년 3월 12일 질문

1개의 답변

0 추천
universal image loader 나 picasso 같은 이미지라이브러리를 이용하세요.
익명사용자 님이 2015년 3월 12일 답변
conertView null 처리하는 부분은 맞게 된건가요?
그리고 스피너의 특정 아이템의 뷰를 참조하려면 어떻게 해야 하나요?
...