网上的资源普遍上是ListView异步加载图片,比较少有GirdView异步加载图片,参考了ListView异步加载图片的做法把GridView的异步加载图片功能做出来,方法和思想大同小异,本文章把GridView异步加载内存卡和网络图片希望对大家有用。效果图如下:



一、主界面代码:

import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.widget.GridView;public class MainActivity extends Activity {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        GridView gridView=(GridView)findViewById(R.id.gridview);        List list = new ArrayList();        String[] paths=new String[15];        for(int i=0;i<15;i++){        int index=i;        paths[i]="/sdcard/"+String.valueOf(index+1)+".jpg";//自己动手向SD卡添加15张图片,如:1.jpg        }        for(int i=0;i<15;i++){        list.add(new ImageAndText(paths[i], String.valueOf(i)));        }        gridView.setAdapter(new ImageAndTextListAdapter(this, list, gridView));    }}

二、以下代码是实现异步获取图片的主方法,SoftReference是软引用,是为了更好的为了系统回收变量,重复的URL直接返回已有的资源,实现回调函数,让数据成功后,更新到UI线程。 

import java.io.IOException;import java.io.InputStream;import java.lang.ref.SoftReference;import java.net.MalformedURLException;import java.net.URL;import java.util.HashMap;import android.R.drawable;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.BitmapFactory.Options;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.os.Handler;import android.os.Message;import android.util.Log;import android.widget.ImageView;public class AsyncImageLoader {     private HashMap> imageCache;     public AsyncImageLoader() {             imageCache = new HashMap>();         }           public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {             if (imageCache.containsKey(imageUrl)) {                 SoftReference softReference = imageCache.get(imageUrl);                 Drawable drawable = softReference.get();                 if (drawable != null) {                     return drawable;                 }             }             final Handler handler = new Handler() {                 public void handleMessage(Message message) {                     imageCallback.imageLoaded((Drawable) message.obj, imageUrl);                 }             };             new Thread() {                 @Override                 public void run() {                     Drawable drawable = loadImageFromUrl(imageUrl);                     imageCache.put(imageUrl, new SoftReference(drawable));                     Message message = handler.obtainMessage(0, drawable);                     handler.sendMessage(message);                 }             }.start();             return null;         }           public static Drawable loadImageFromUrl(String url) {//    /**//     * 加载网络图片//     *///            URL m;//            InputStream i = null;//            try {//                m = new URL(url);//                i = (InputStream) m.getContent();//            } catch (MalformedURLException e1) {//                e1.printStackTrace();//            } catch (IOException e) {//                e.printStackTrace();//            }//            Drawable d = Drawable.createFromStream(i, "src");        /**     * 加载内存卡图片     */        Options options=new Options();        options.inSampleSize=2;        Bitmap bitmap=BitmapFactory.decodeFile(url, options);        Drawable drawable=new BitmapDrawable(bitmap);            return drawable;        }          public interface ImageCallback {             public void imageLoaded(Drawable imageDrawable, String imageUrl);                      }}


三、ImageAndTextListAdapter是实现ListView的Adapter,里面有个技巧就是 imageView.setTag(imageUrl),setTag是存储数据的,这样是为了保证在回调函数时,listview去更新自己对应 item。

import java.util.List;import cn.wangmeng.test.AsyncImageLoader.ImageCallback;import android.app.Activity;import android.graphics.drawable.Drawable;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.GridView;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;public class ImageAndTextListAdapter extends ArrayAdapter {        private GridView gridView;        private AsyncImageLoader asyncImageLoader;        public ImageAndTextListAdapter(Activity activity, List imageAndTexts, GridView gridView1) {            super(activity, 0, imageAndTexts);            this.gridView = gridView1;            asyncImageLoader = new AsyncImageLoader();        }        public View getView(int position, View convertView, ViewGroup parent) {            Activity activity = (Activity) getContext();            // Inflate the views from XML            View rowView = convertView;            ViewCache viewCache;            if (rowView == null) {                LayoutInflater inflater = activity.getLayoutInflater();                rowView = inflater.inflate(R.layout.griditem, null);                viewCache = new ViewCache(rowView);                rowView.setTag(viewCache);            } else {                viewCache = (ViewCache) rowView.getTag();            }            ImageAndText imageAndText = getItem(position);            // Load the image and set it on the ImageView            String imageUrl = imageAndText.getImageUrl();            ImageView imageView = viewCache.getImageView();            imageView.setTag(imageUrl);            Drawable cachedImage = asyncImageLoader.loadDrawable(imageUrl, new ImageCallback() {                public void imageLoaded(Drawable imageDrawable, String imageUrl) {                    ImageView imageViewByTag = (ImageView) gridView.findViewWithTag(imageUrl);                    if (imageViewByTag != null) {                        imageViewByTag.setImageDrawable(imageDrawable);                    }                }            });            if (cachedImage == null) {                imageView.setImageResource(R.drawable.icon);            }else{                imageView.setImageDrawable(cachedImage);            }            // Set the text on the TextView            TextView textView = viewCache.getTextView();            textView.setText(imageAndText.getText());            return rowView;        }}

四、2个辅助类:

public class ImageAndText {    private String imageUrl;    private String text;    public ImageAndText(String imageUrl, String text) {        this.imageUrl = imageUrl;        this.text = text;    }    public String getImageUrl() {        return imageUrl;    }    public String getText() {        return text;    }}

public class ViewCache {    private View baseView;    private TextView textView;    private ImageView imageView;    public ViewCache(View baseView) {        this.baseView = baseView;    }    public TextView getTextView() {        if (textView == null) {            textView = (TextView) baseView.findViewById(R.id.text);        }        return textView;    }    public ImageView getImageView() {        if (imageView == null) {            imageView = (ImageView) baseView.findViewById(R.id.image);        }        return imageView;    }}


五、Xml配置文件,包括griditem和main:

1griditem:

<?xml version="1.0" encoding="UTF-8"?>                                        
2main:
<?xml version="1.0" encoding="utf-8"?> 


   

   
六、大功告成,总结方法。




更多相关文章

  1. ImageLoader源码解析
  2. 上官网学android之五(Managing the Activity Lifecycle)
  3. Android(安卓)Glide图片加载框架图片变色变绿解决方法
  4. android:用getIdentifier()获取资源Id
  5. 【Android(安卓)基础】 序列化 Parcelable 使用
  6. Android(安卓)API之onLayout, onMeasure
  7. Android平台向web应用get、post方式提交信息案例
  8. 【Android(安卓)Developers Training】 24. 保存键值对
  9. Android(安卓)手机上传图片至javaweb服务器(servlet)

随机推荐

  1. android studio驾校题库计分项目
  2. Flash Android(安卓)P Preview Image int
  3. Android图片压缩
  4. Android重启应用和重启手机
  5. android酷炫翻页效果+图形分析
  6. Android(安卓)开发之webview页面返回到最
  7. 初识ViewPager【Android】
  8. 自定义录像机 没任何新意
  9. Android——简单对话框
  10. Android汉字转换成拼音