listview适配器中的java.lang.outofmemoryerror异常

时间:2014-10-29 23:34:14

标签: android memory bitmap

我的listview适配器有问题。这里我的源代码适用于适配器:

public class ListItemAdapter extends BaseAdapter {
        private static ArrayList<ItemDetail_class> DataProcessorResult;
        private LayoutInflater myInflater;
        Context mycontext;

        public ListItemAdapter(Context context, ArrayList<ItemDetail_class> results) {
            DataProcessorResult = results;
            myInflater = LayoutInflater.from(context);
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return DataProcessorResult.size();      
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return DataProcessorResult.get(position);
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            ViewHolder holder; 
            final Context mycontext=parent.getContext();

            if(convertView == null) {
                convertView = myInflater.inflate(R.layout.custom_view_item, null);
                holder = new ViewHolder();
                holder.tvitemcode = (TextView) convertView.findViewById(R.id.tvitemcode);
                holder.tvitemname = (TextView) convertView.findViewById(R.id.tvitemname);
                holder.tvsize = (TextView) convertView.findViewById(R.id.tvsize);
                holder.tvprice = (TextView) convertView.findViewById(R.id.tvprice);                       
                holder.imgitem= (ImageView) convertView.findViewById(R.id.imgitem); 
                holder.imgview= (ImageView) convertView.findViewById(R.id.imgview); 

                convertView.setTag(holder);            
            }else{
                holder = (ViewHolder) convertView.getTag();
            }

            holder.tvitemcode.setText(DataProcessorResult.get(position).getItemCode());
            holder.tvitemname.setText(DataProcessorResult.get(position).getItemName());
            holder.tvsize.setText(DataProcessorResult.get(position).getSize());
            holder.tvprice.setText(DataProcessorResult.get(position).getPrice());

            holder.tvitemcode.setTextSize(TypedValue.COMPLEX_UNIT_PX, mycontext.getResources().getDimensionPixelSize( R.dimen.lbllistviewitem));
            holder.tvitemname.setTextSize(TypedValue.COMPLEX_UNIT_PX, mycontext.getResources().getDimensionPixelSize( R.dimen.lbllistviewitem));
            holder.tvsize.setTextSize(TypedValue.COMPLEX_UNIT_PX, mycontext.getResources().getDimensionPixelSize( R.dimen.lbllistviewitem));
            holder.tvprice.setTextSize(TypedValue.COMPLEX_UNIT_PX, mycontext.getResources().getDimensionPixelSize( R.dimen.lbllistviewitem));

            String imgName = DataProcessorResult.get(position).getItemCode();
            imgName=(imgName.replace("-",""));
            imgName=imgName.toLowerCase();
            int imgID=0;
            holder.imgitem.getLayoutParams().width= mycontext.getResources().getDimensionPixelSize( R.dimen.photolistviewitem);
            holder.imgitem.getLayoutParams().height= mycontext.getResources().getDimensionPixelSize( R.dimen.photolistviewitem);

            if (mycontext.getResources().getIdentifier(imgName+"_1", "drawable", mycontext.getPackageName())==0)
            {
                String imagepath = Environment.getExternalStorageDirectory() + "/Asiades/"+imgName+".jpg";
                File FileMain = new File(imagepath); 
                if (FileMain.exists()){ 
                    BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inPreferredConfig = Bitmap.Config.ARGB_8888;
                    options.inSampleSize = 8;
                    Bitmap bitmap = BitmapFactory.decodeFile(imagepath, options);        
                    holder.imgitem.setImageBitmap(bitmap);          
                }else{
                    imgID = mycontext.getResources().getIdentifier("blankitem", "drawable", mycontext.getPackageName());
                    holder.imgitem.setImageResource(imgID);
                }                       
            }else {
                imgID = mycontext.getResources().getIdentifier(imgName+"_1", "drawable", mycontext.getPackageName()); 
                holder.imgitem.setImageResource(imgID);         
            }       

            holder.imgview.getLayoutParams().width= mycontext.getResources().getDimensionPixelSize( R.dimen.arrowicon);
            holder.imgview.getLayoutParams().height= mycontext.getResources().getDimensionPixelSize( R.dimen.arrowicon); 

            holder.imgview.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    OtherClass.setItemCode(DataProcessorResult.get(position).getItemCode());
                    Intent MyIntent=new Intent(mycontext, ViewDetailItem.class);                                    
                    mycontext.startActivity(MyIntent);
                }
            });

            if (position % 2 == 1) {convertView.setBackgroundColor(Color.WHITE);} else {convertView.setBackgroundColor(Color.rgb(208,212,208)); }        
            return convertView;
        }

        static class ViewHolder {
            TextView tvitemcode;
            TextView tvitemname;
            TextView tvsize;
            TextView tvprice;
            ImageView imgitem;
            ImageView imgview;
        }

    }

这是我的logcat错误: 10-30 00:12:38.370:E / AndroidRuntime(22719):在android.content.res.Resources.loadDrawable(Resources.java:3022) 10-30 00:12:38.370:E / AndroidRuntime(22719):在android.content.res.Resources.getDrawable(Resources.java:1586) 10-30 00:12:38.370:E / AndroidRuntime(22719):在android.widget.ImageView.resolveUri(ImageView.java:648) 10-30 00:12:38.370:E / AndroidRuntime(22719):在android.widget.ImageView.setImageResource(ImageView.java:377)

有人可以帮我解决这个问题吗?非常感谢你

1 个答案:

答案 0 :(得分:0)

您无法在UI线程上加载这些图像。您需要使用AsyncTaskimage loading library