这篇文章是自己做的一个笔记,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>
最后显示一下效果:
点击进入我们可以看到滑动的viewpager,注意图片显示是直接从我们DiskLruCache中获取的图片,如果没有从网上下载图,那么显示会出问题
代码示例百度云盘下载code:
链接:http://pan.baidu.com/s/1bnyM2Xx 密码:m94g