安卓学习历程-第三天

参照网上代码,使用AsyncTask和Adapter实现图片异步加载

         继承BaseAdapter类自定义Adapter类

         使用mLayoutInFlater实现动态加载布局

         使用getTag()与setTag()优化Item的加载

    private Context mContext;
    private LayoutInflater mLayoutInFlater=null;
    private List<String> mList=null;

    private int width=120;
    private int height=150;

    public static class MyGridViewHolder{
        public ImageView imageview_thumbnail;
        public TextView textview_test;
    }

    public MyGridViewAdapter(Context context,List<String> list){
        this.mContext=context;
        this.mList=list;
        mLayoutInFlater= LayoutInflater.from(context);
    }

    @Override
    public int getCount(){
        return mList.size();
    }

    @Override
    public Object getItem(int arg0){
        return null;
    }

    @Override
    public long getItemId(int position){
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        MyGridViewHolder viewHolder = null;
        if (convertView == null) {
            viewHolder = new MyGridViewHolder();
            convertView = mLayoutInFlater.inflate(R.layout.layout_my_gridview_item, null);
            viewHolder.imageview_thumbnail = (ImageView) convertView.findViewById(R.id.imageview_thumbnail);
            viewHolder.textview_test = (TextView) convertView.findViewById(R.id.textview_test);
            convertView.setTag(viewHolder);
        } else
            viewHolder = (MyGridViewHolder) convertView.getTag();

        String url=mList.get(position);
        //需要加载的图片已经在加载,不用添加线程加载
        //如果不是加载需要的图片,取消线程,创建线程加载需要的图片
        if(cancelPotentialLoad(url,viewHolder.imageview_thumbnail)){
            AsyncLoadImageTask task=new AsyncLoadImageTask(viewHolder.imageview_thumbnail);  //创建线程 加载图片
            LoadedDrawable loadedDrawable=new LoadedDrawable(task);                            //记录加载任务
            viewHolder.imageview_thumbnail.setImageDrawable(loadedDrawable);                 //设置图片
            task.execute(position);
        }
        viewHolder.textview_test.setText((position+1)+"");                                    //设置文本
        return convertView;
    }

         使用AsyncTask异步加载图片,并自定义函数检测,防止多个线程同时加载图片

private class AsyncLoadImageTask extends AsyncTask<Integer,Void,Bitmap> {
        private String url=null;
        private final WeakReference<ImageView> imageViewWeakReference;

        public AsyncLoadImageTask(ImageView imageview){
            super();
            imageViewWeakReference=new WeakReference<ImageView>(imageview);
        }

        protected Bitmap doInBackground(Integer... params){  //将图片和地址存入map
            Bitmap bitmap=null;
            this.url=mList.get(params[0]);
            bitmap=getBitmapFromUrl(url);                     //获取图片
            MainActivity.gridviewBitmapCaches.put(mList.get(params[0]),bitmap);
            return bitmap;
        }

        protected void onPostExecute(Bitmap resultBitmap){  //将图片放入imageview??
            if(isCancelled()){
                resultBitmap=null;
            }
            if(imageViewWeakReference!=null){
                ImageView imageView=imageViewWeakReference.get();
                AsyncLoadImageTask loadImageTask=getAsyncLoadImageTask(imageView);
                if(this==loadImageTask){
                    imageView.setImageBitmap(resultBitmap);
                    imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
                }
            }
            super.onPostExecute(resultBitmap);
        }
    }

         定义函数压缩图片,节约内存

        

public static Bitmap getBitmapThumbnail(String path, int width, int height) {
        Bitmap bitmap = null;
        BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, opts);
        opts.inSampleSize = Math.max((int) (opts.outHeight / (float) height), (int) (opts.outWidth / (float) width));
        opts.inJustDecodeBounds = false;
        bitmap = BitmapFactory.decodeFile(path, opts);
        return bitmap;
    }

    public static Bitmap getBitmapThumbnail(Bitmap bmp,int width,int height){
        Bitmap bitmap=null;
        if(bmp!=null){
            int bmpWidth=bmp.getWidth();
            int bmpHeight=bmp.getHeight();

            if(width!=0&&height!=0){
                Matrix matrix=new Matrix();
                float scaleWidth=((float)width/bmpWidth);
                float scaleHeight=((float)height/bmpHeight);

                matrix.postScale(scaleWidth,scaleHeight);
                bitmap=Bitmap.createBitmap(bmp,0,0,bmpWidth,bmpHeight,matrix,true);
            }
            else{
                bitmap=bmp;
            }
        }
        return bitmap;
    }


         文章摘自:

         http://blog.csdn.net/jia516967927/article/details/50730502

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值