GridView+DiskLruCache+LruCache+ViewPage显示图片效果

这篇文章是自己做的一个笔记,code主要参考了郭霖大神的代码,增加了滑动加载功能,与ViewPage显示功能,并且在代码加载的写法与郭神稍微有点区别!
主要的GridView适配器MyImageAdapter 代码

package com.qs.photowall.adapter;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashSet;
import java.util.Set;

import com.qs.photowall.R;

import libcore.io.DiskLruCache;
import libcore.io.DiskLruCache.Snapshot;
import android.content.Context;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.LruCache;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class MyImageAdapter extends ArrayAdapter implements OnScrollListener{

private LruCache mLruCache;
private DiskLruCache mDiskLruCache;
private Set mWorks ;
private GridView mGridView ;
private int mFirstVisableItem ;
private int mVisibleItemCount ;
private boolean mIsFirstEnter = true;
/**
 * 记录每个子项的高度。
 */
private int mItemHeight = 0;
private final int MAXSIZE = 10*1024*1024;
    public MyImageAdapter(Context context, int textViewResourceId,
            String[] objects,GridView gridView) {
        super(context, textViewResourceId, objects);
        mGridView = gridView;
        int maxMemory = (int) Runtime.getRuntime().maxMemory();
        int CacheMemory = maxMemory/8;//分配内存给LruCache
        mWorks = new HashSet();
        mLruCache = new LruCache(CacheMemory){

            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getByteCount();
            }
        };
        //获取硬盘缓存对象
        try {
            File cacheFileDir = getCacheDir(context, "temp");
            if(!cacheFileDir.exists())cacheFileDir.mkdir();//这里记得创建我们的缓存文件夹
            mDiskLruCache = DiskLruCache.open(cacheFileDir, getAppVersion(context), 1,MAXSIZE);
        } catch (IOException e) {
            e.printStackTrace();
        }
        mGridView.setOnScrollListener(this);
    }

    /**
     * 设置item子项的高度。
     */
    public void setItemHeight(int height) {
        if (height == mItemHeight) {
            return;
        }
        mItemHeight = height;
        notifyDataSetChanged();
    }



    public LruCache getmLruCache() {
        return mLruCache;
    }

    public void setmLruCache(LruCache mLruCache) {
        this.mLruCache = mLruCache;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String imageUrl = getItem(position);
        View view;
        if(convertView==null){
            view = LayoutInflater.from(getContext()).inflate(R.layout.cell, null);
        }else{
            view = convertView;
        }
        final ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
         if (imageView.getLayoutParams().height != mItemHeight) {  
                imageView.getLayoutParams().height = mItemHeight;  
            }
        imageView.setTag(imageUrl);
//      loadBitmaps(imageView, imageUrl);//没添加滑动加载时候的代码
        return view;
    }

     /** 
     * 将缓存记录同步到journal文件中。 
     */  
    public void fluchCache() {  
        if (mDiskLruCache != null) {  
            try {  
                mDiskLruCache.flush();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    } 

    //获取缓存的路径
    public File getCacheDir(Context context,String uniqueName)
    {
        String CacheDir;
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) || !Environment.isExternalStorageRemovable())
            CacheDir =  Environment.getExternalStorageDirectory().getPath();
        else
            CacheDir =  context.getCacheDir().getPath();
        return new File(CacheDir+File.separator+uniqueName);
    }
    //获取应用程序的版本号
    public int getAppVersion(Context context){
        int version = 0;
        try {
            version = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        return version;
    }

    //获取key的MD5 编码之后转成十六进制的值
    public String getMd5keyForDisk(String key)
    {
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            digest.update(key.getBytes());//赋值给编码器需要编码的值
            return bytesToHexString(digest.digest());//digest.digest()获取编码过后的值
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return String.valueOf(key.hashCode());
        }
    }
    //字节转成16进制字符,返回转换完成之后的字符串
     private String bytesToHexString(byte[] bytes) {  
            StringBuilder sb = new StringBuilder();  
            for (int i = 0; i < bytes.length; i++) {  
                String hex = Integer.toHexString(0xFF & bytes[i]);  
                if (hex.length() == 1) {  
                    sb.append('0');  
                }  
                sb.append(hex);  
            }  
            return sb.toString();  
     }

     /**
      * 添加bitmap到LruCache缓存中去
      * */
     public  void addBitmapToCache(String key,Bitmap map){
         if(getBitmapFromCache(key) == null)//如果以前没有添加
             mLruCache.put(key, map);
     }
     /**
      * 从LruCache缓冲中获取bitmap
      * */
     public Bitmap getBitmapFromCache(String key)
     {
         return mLruCache.get(key);
     }

     public void loadBitmaps(ImageView imageView, String imageUrl) 
     {
         Bitmap bitmap = getBitmapFromCache(imageUrl);
        if(bitmap==null){
            MyWorkTask task = new MyWorkTask();
            mWorks.add(task);
            task.execute(imageUrl);
        }else{
            if(imageView != null && bitmap!=null)
                imageView.setImageBitmap(bitmap);
        }
     }
     /**
      * 这里通过直接传入的图片的url地址返回一个Bitmap对象
      */
     public Bitmap DownLoadImageFromUrl(String imageUrl)
     {
         InputStream in = null;
         HttpURLConnection conn =null;
         Bitmap bitmap = null;
         try {
            URL url = new URL(imageUrl);
            conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(10*1000);
            conn.setConnectTimeout(10*1000);
            conn.setDoInput(true);
            in = conn.getInputStream();
            bitmap = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }finally{
                try {
                    if(in!=null)
                     in.close();
                    if(conn!=null)
                        conn.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
         return bitmap;
     }

     class MyWorkTask extends AsyncTask{

         String imageUrl = null;
        @Override
        protected Bitmap doInBackground(String... params) {
            String imageUrlKey = null;
            Snapshot snapshot = null;
            Bitmap down_bitmap  = null;
            OutputStream out = null;
            if(params[0]!=null)
                imageUrl = params[0];
            imageUrlKey = getMd5keyForDisk(imageUrl);
            try {
                snapshot = mDiskLruCache.get(imageUrlKey);
                if(snapshot==null)//硬盘缓存中没有我们需要的数据,因此需要下载
                {
                    down_bitmap  =  DownLoadImageFromUrl(imageUrl);
                    DiskLruCache.Editor editor = mDiskLruCache.edit(imageUrlKey);
                    if(editor!=null )
                    {
                        if(down_bitmap!=null){
                            addBitmapToCache(imageUrlKey, down_bitmap);//添加到内存缓存中
                            out = editor.newOutputStream(0);
                            down_bitmap.compress(CompressFormat.JPEG, 100, out);
                            editor.commit();//添加到硬盘缓存中
                        }else
                        {
                            editor.abort();
                        }
                        // 缓存被写入后,再次查找key对应的缓存   
                        snapshot = mDiskLruCache.get(imageUrlKey);  
                    }
                }
                if(snapshot!=null){
                    down_bitmap = BitmapFactory.decodeStream(snapshot.getInputStream(0));
                    addBitmapToCache(imageUrl, down_bitmap);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                try {
                    if(out!=null)
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return down_bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            ImageView imageView = (ImageView) mGridView.findViewWithTag(imageUrl);  
            if (imageView != null && bitmap != null) {
                System.out.println(imageUrl);
                    imageView.setImageBitmap(bitmap);  
            }  
            mWorks.remove(this);  
        }
     }

     public void CancelAllTask(){
         if(mWorks!=null){
             for(MyWorkTask task:mWorks){
                task.cancel(false);
             }
         }
     }



    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {

        if(scrollState == SCROLL_STATE_IDLE){
            for(int i=mFirstVisableItem;ielse{
            CancelAllTask();
        }
    }



    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        mFirstVisableItem = firstVisibleItem;
        mVisibleItemCount = visibleItemCount;
        if(mIsFirstEnter && visibleItemCount>0){
            for (int i = firstVisibleItem; i < visibleItemCount+firstVisibleItem; i++) {
                ImageView imageView = (ImageView) mGridView.findViewWithTag(getItem(i));
                loadBitmaps(imageView, getItem(i));
            }
            mIsFirstEnter = false;
        }
    }
}

如需详细的代码注释,可以参考郭神的章:http://blog.csdn.net/sinyu890807/article/details/34093441

MainActivity的code部分为:

package com.qs.photowall;

import com.qs.photowall.adapter.MyImageAdapter;
import com.qs.photowall.database.MyImages;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;

/**
 * 实现一个网络图片的下载功能,具体操作是采用双缓存机制:
 * DiskLruCache(硬盘缓存机制) +  LruCache(内存缓存机制)
 * */
public class MainActivity extends Activity {

    private GridView gridView;
    private  MyImageAdapter adapter;

    private int mImageThumbSize;
    private int mImageThumbSpacing;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gridView = (GridView) findViewById(R.id.gridView);
        adapter = new MyImageAdapter(this, 0, MyImages.ThumbImages,gridView);
        gridView.setAdapter(adapter);
        mImageThumbSize = getResources().getDimensionPixelSize(
                R.dimen.image_thumbnail_size);
        mImageThumbSpacing = getResources().getDimensionPixelSize(
                R.dimen.image_thumbnail_spacing);

        gridView.getViewTreeObserver().addOnGlobalLayoutListener(
                new ViewTreeObserver.OnGlobalLayoutListener() {

                    @Override
                    public void onGlobalLayout() {
                        final int numColumns = (int) Math.floor(gridView
                                .getWidth()
                                / (mImageThumbSize + mImageThumbSpacing));
                        if (numColumns > 0) {
                            int columnWidth = (gridView.getWidth() / numColumns)
                                    - mImageThumbSpacing;
                            adapter.setItemHeight(columnWidth);
                            gridView.getViewTreeObserver()
                                    .removeGlobalOnLayoutListener(this);
                        }
                    }
                });
        gridView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView parent, View view,
                    int position, long id) {
                Intent intent  = new Intent(MainActivity.this,BigActivity.class);
                intent.putExtra("pagenum", position);
                startActivity(intent);
            }

        });
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
       adapter.fluchCache();//如果这里没有做过存储,下次我们将显示不了图片,因为硬盘缓存已经存在,但是没提交到数据表中所以能找到但是不能显示
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        adapter.CancelAllTask();
    }
}

然后就是Viewpager的适配器代码:

package com.qs.photowall.adapter;

import java.io.File;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import libcore.io.DiskLruCache;
import libcore.io.DiskLruCache.Snapshot;
import android.content.Context;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.qs.photowall.R;

public class MyViewPagerAdapter extends PagerAdapter{
    private Context mContext;
    private String[] mImages;
    private DiskLruCache mDiskLruCache;
    public MyViewPagerAdapter(Context context ,String[] images){
        mContext =context;
        mImages = images;
            File cacheFileDir = getCacheDir(context, "temp");
            try {
                mDiskLruCache = DiskLruCache.open(cacheFileDir, getAppVersion(context), 1,10*1024*1024);
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
    @Override
    public int getCount() {
        return mImages.length;
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == arg1;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager)container).removeView(container.findViewWithTag( mImages[position]));
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View view  = LayoutInflater.from(mContext).inflate(R.layout.big_item, null);
        ImageView imageView = (ImageView) view.findViewById(R.id.bigView);
        String imageUrl = mImages[position];
        container.setTag(imageUrl);
         String imageKey = getMd5keyForDisk(imageUrl);
         Snapshot snapshot = null;
         try {
            snapshot = mDiskLruCache.get(imageKey);
        } catch (IOException e) {
            e.printStackTrace();
        }
         Bitmap bitmap = null ;
         if(snapshot!=null)
             bitmap = BitmapFactory.decodeStream(snapshot.getInputStream(0));
        imageView.setImageBitmap(bitmap);
        ((ViewPager)container).addView(view);
        return view;
    }


    //获取缓存的路径
    public File getCacheDir(Context context,String uniqueName)
    {
        String CacheDir;
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) || !Environment.isExternalStorageRemovable())
            CacheDir =  Environment.getExternalStorageDirectory().getPath();
        else
            CacheDir =  context.getCacheDir().getPath();
        return new File(CacheDir+File.separator+uniqueName);
    }

    //获取应用程序的版本号
    public int getAppVersion(Context context){
        int version = 0;
        try {
            version = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        return version;
    }

    //获取key的MD5 编码之后转成十六进制的值
    public String getMd5keyForDisk(String key)
    {
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            digest.update(key.getBytes());//赋值给编码器需要编码的值
            return bytesToHexString(digest.digest());//digest.digest()获取编码过后的值
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return String.valueOf(key.hashCode());
        }
    }
    //字节转成16进制字符,返回转换完成之后的字符串
     private String bytesToHexString(byte[] bytes) {  
            StringBuilder sb = new StringBuilder();  
            for (int i = 0; i < bytes.length; i++) {  
                String hex = Integer.toHexString(0xFF & bytes[i]);  
                if (hex.length() == 1) {  
                    sb.append('0');  
                }  
                sb.append(hex);  
            }  
            return sb.toString();  
     }

}

上面你们可以看到有些code重复了,其实可以剥离作为工具类,这里我偷懒了,就没做!
然后就是Viewpager显示的Activity:

package com.qs.photowall;


import com.qs.photowall.adapter.MyViewPagerAdapter;
import com.qs.photowall.database.MyImages;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;

public class BigActivity extends Activity {
    private ViewPager mViewPager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.big);
        mViewPager = (ViewPager) findViewById(R.id.myViewPage);
        MyViewPagerAdapter ViewpageAdapter = new MyViewPagerAdapter(this, MyImages.ThumbImages);
        mViewPager.setAdapter(ViewpageAdapter);
        mViewPager.setCurrentItem(getIntent().getIntExtra("pagenum", 0));
    }
}

图片的地址全部来自郭神的图片:

package com.qs.photowall.database;

public class MyImages {
    public final static String[] ThumbImages = new String[]{
        "https://img-my.csdn.net/uploads/201407/26/1406383299_1976.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383291_6518.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383291_8239.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383290_9329.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383290_1042.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383275_3977.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383265_8550.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383264_3954.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383264_4787.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383264_8243.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383248_3693.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383243_5120.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383242_3127.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383242_9576.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383242_1721.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383219_5806.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383214_7794.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383213_4418.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383213_3557.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383210_8779.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383172_4577.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383166_3407.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383166_2224.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383166_7301.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383165_7197.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383150_8410.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383131_3736.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383130_5094.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383130_7393.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383129_8813.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383100_3554.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383093_7894.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383092_2432.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383092_3071.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383091_3119.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383059_6589.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383059_8814.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383059_2237.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383058_4330.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406383038_3602.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382942_3079.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382942_8125.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382942_4881.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382941_4559.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382941_3845.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382924_8955.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382923_2141.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382923_8437.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382922_6166.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382922_4843.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382905_5804.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382904_3362.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382904_2312.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382904_4960.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382900_2418.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382881_4490.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382881_5935.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382880_3865.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382880_4662.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382879_2553.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382862_5375.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382862_1748.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382861_7618.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382861_8606.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382861_8949.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382841_9821.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382840_6603.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382840_2405.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382840_6354.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382839_5779.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382810_7578.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382810_2436.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382809_3883.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382809_6269.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382808_4179.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382790_8326.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382789_7174.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382789_5170.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382789_4118.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382788_9532.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382767_3184.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382767_4772.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382766_4924.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382766_5762.jpg",  
        "https://img-my.csdn.net/uploads/201407/26/1406382765_7341.jpg"
    };
}

然后DiskLruCache工具包为libcore.io 里面直接把下载的DiskLruCache.java文件放进去就可以了

接下来是几个布局文件:
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <GridView  
        android:id="@+id/gridView"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:columnWidth="@dimen/image_thumbnail_size"  
        android:gravity="center"  
        android:horizontalSpacing="@dimen/image_thumbnail_spacing"  
        android:numColumns="auto_fit"  
        android:stretchMode="columnWidth"  
        android:verticalSpacing="@dimen/image_thumbnail_spacing" >  
    GridView>  
LinearLayout>

big_item.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ImageView 
        android:id="@+id/bigView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

LinearLayout>

big.xml:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

<android.support.v4.view.ViewPager
    android:id="@+id/myViewPage"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />
LinearLayout>

cell.xml:


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
>
    <ImageView 
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/empty_photo"
        android:scaleType="fitXY"
        android:layout_centerInParent="true"  
        />

RelativeLayout>

然后是我们的AndroidManifest.xml文件:


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.qs.photowall"
    android:versionCode="1"
    android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="14" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            intent-filter>
        activity>
        <activity android:name="com.qs.photowall.BigActivity">activity>
    application>

manifest>

最后显示一下效果:
GridView+DiskLruCache+LruCache+ViewPage显示图片效果_第1张图片
点击进入我们可以看到滑动的viewpager,注意图片显示是直接从我们DiskLruCache中获取的图片,如果没有从网上下载图,那么显示会出问题
GridView+DiskLruCache+LruCache+ViewPage显示图片效果_第2张图片

代码示例百度云盘下载code:
链接:http://pan.baidu.com/s/1bnyM2Xx 密码:m94g

你可能感兴趣的:(Android笔记)