转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/20481185),请尊重他人的辛勤劳动成果,谢谢!
大家好!过完年回来到现在差不多一个月没写文章了,一是觉得不知道写哪些方面的文章,没有好的题材来写,二是因为自己的一些私事给耽误了,所以过完年的第一篇文章到现在才发表出来,2014年我还是会继续在CSDN上面更新我的博客,欢迎大家关注一下,今天这篇文章主要的是介绍下开源库StickyGridHeaders的使用,StickyGridHeaders是一个自定义GridView带sections和headers的Android库,sections就是GridView item之间的分隔,headers就是固定在GridView顶部的标题,类似一些Android手机联系人的效果,StickyGridHeaders的介绍在https://github.com/TonicArtos/StickyGridHeaders,与此对应也有一个相同效果的自定义ListView带sections和headers的开源库https://github.com/emilsjolander/StickyListHeaders,大家有兴趣的可以去看下,我这里介绍的是StickyGridHeaders的使用,我在Android应用方面看到使用StickyGridHeaders的不是很多,而是在Iphone上看到相册采用的是这种效果,于是我就使用StickyGridHeaders来仿照Iphone按照日期分隔显示本地图片
我们先新建一个Android项目StickyHeaderGridView,去https://github.com/TonicArtos/StickyGridHeaders下载开源库,为了方便浏览源码我直接将源码拷到我的工程中了
com.tonicartos.widget.stickygridheaders这个包就是我放StickyGridHeaders开源库的源码,com.example.stickyheadergridview这个包是我实现此功能的代码,类看起来还蛮多的,下面我就一一来介绍了
GridItem用来封装StickyGridHeadersGridView 每个Item的数据,里面有本地图片的路径,图片加入手机系统的时间和headerId
package com.example.stickyheadergridview;/** * @blog http://blog.csdn.net/xiaanming * * @author xiaanming * */public class GridItem { /** * 图片的路径 */ private String path; /** * 图片加入手机中的时间,只取了年月日 */ private String time; /** * 每个Item对应的HeaderId */ private int headerId; public GridItem(String path, String time) { super(); this.path = path; this.time = time; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public int getHeaderId() { return headerId; } public void setHeaderId(int headerId) { this.headerId = headerId; } }
图片的路径path和图片加入的时间time 我们直接可以通过ContentProvider获取,但是headerId需要我们根据逻辑来生成。
package com.example.stickyheadergridview;import android.content.ContentResolver;import android.content.Context;import android.content.Intent;import android.database.Cursor;import android.net.Uri;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.provider.MediaStore;/** * 图片扫描器 * * @author xiaanming * */public class ImageScanner { private Context mContext; public ImageScanner(Context context){ this.mContext = context; } /** * 利用ContentProvider扫描手机中的图片,将扫描的Cursor回调到ScanCompleteCallBack * 接口的scanComplete方法中,此方法在运行在子线程中 */ public void scanImages(final ScanCompleteCallBack callback) { final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); callback.scanComplete((Cursor)msg.obj); } }; new Thread(new Runnable() { @Override public void run() { //先发送广播扫描下整个sd卡 mContext.sendBroadcast(new Intent( Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; ContentResolver mContentResolver = mContext.getContentResolver(); Cursor mCursor = mContentResolver.query(mImageUri, null, null, null, MediaStore.Images.Media.DATE_ADDED); //利用Handler通知调用线程 Message msg = mHandler.obtainMessage(); msg.obj = mCursor; mHandler.sendMessage(msg); } }).start(); } /** * 扫描完成之后的回调接口 * */ public