커스텀 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 처리 부분이 잘 된것 맞나요?
고수님들의 가르침을 부탁드립니다.