该项目实现的功能如下:
获取手机相册,点击每个相册之后进入该相册的图片列表界面,在图片列表界面可以实现图片多选,然后进入所选择的图片界面,在该界面内可以实现所选图片的上传等功能。
该项目最大特色:
1、获取相册列表,目前网络上面介绍获取相册的项目很少,本文专门讲述相册的获取。
2、使用Android-Universal-Image-Loader集成框架-第三方jar包加载本地图片,熟悉这个jar的开发者肯定不陌生,该jar包十分强大,除了可以获取网络图片,本地图片也是可以的。同时,通过引用第三方jar可以有效解决OOM异常问题。
继续上一篇博文的讲述,上一篇博文中通过一个异步加载类实现了获取本地相册和本地图片的数据,本篇博文主要讲述相册列表界面的实现,首先给出相册列表Activity类代码如下:
public class AlbumsActivity extends Activity {
private GridView gridView;
private AlbumsAdapter adapter;//适配器
private PhotoUpAlbumHelper photoUpAlbumHelper;//加载相册和图片的异步线程类
private List<PhotoUpImageBucket> list;//存放相册列表数据
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.albums_gridview);
init();//初始化
loadData();//加载数据
onItemClick();//设置相册点击事件
}
private void init(){
gridView = (GridView) findViewById(R.id.album_gridv);
adapter = new AlbumsAdapter(AlbumsActivity.this);
gridView.setAdapter(adapter);
}
private void loadData(){
photoUpAlbumHelper = PhotoUpAlbumHelper.getHelper();//创建异步线程实例
photoUpAlbumHelper.init(AlbumsActivity.this);//初始化实例
//回调接口,创建匿名内部对象,实现接口中的方法,获取到PhotoUpAlbumHelper的接口GetAlbumList所传递的数据
photoUpAlbumHelper.setGetAlbumList(new GetAlbumList() {
@Override
public void getAlbumList(List<PhotoUpImageBucket> list) {
adapter.setArrayList(list);
adapter.notifyDataSetChanged();//更新视图
AlbumsActivity.this.list = list;
}
});
photoUpAlbumHelper.execute(false);//异步线程执行
}
//通过点击每个相册,进入相册内部查看该相册内的图片
private void onItemClick(){
gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent intent = new Intent(AlbumsActivity.this,AlbumItemActivity.class);
intent.putExtra("imagelist", list.get(position));
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
相册列表界面比较简单,不能懂,下面给出该界面的适配器代码,适配器代码采用重写非常常见的BaseAdapter类实现,也很简单,主要的特色在于采用第三方的jar包Android-Universal-Image-Loader实现相册封面的加载:
public class AlbumsAdapter extends BaseAdapter {
private List<PhotoUpImageBucket> arrayList;
private LayoutInflater layoutInflater;
private ImageLoader imageLoader = ImageLoader.getInstance();//初始化获取实例
private DisplayImageOptions options;
private String TAG = AlbumsAdapter.class.getSimpleName();//开发测试标记位
public AlbumsAdapter(Context context){
layoutInflater = LayoutInflater.from(context);
arrayList = new ArrayList<PhotoUpImageBucket>();//初始化集合
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(new Md5FileNameGenerator())
.tasksProcessingOrder(QueueProcessingType.LIFO)
.memoryCacheExtraOptions(96, 120)
.build();//初始化图片加载器的配置
// Initialize ImageLoader with configuration.
imageLoader.init(config);
// 使用DisplayImageOption.Builder()创建DisplayImageOptions
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.default_loading_pic) // 设置图片下载期间显示的图片
.showImageForEmptyUri(R.drawable.default_loading_pic) // 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.default_loading_pic) // 设置图片加载或解码过程中发生错误显示的图片
.cacheInMemory(true) // 设置下载的图片是否缓存在内存中
.cacheOnDisc(true) // 设置下载的图片是否缓存在SD卡中
// .displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片
.bitmapConfig(Config.RGB_565)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.build(); // 创建配置过的DisplayImageOption对象
//上面的默认图片或者无法加载情况下的图片开发者可以自己设置,当然,可以设置不同的显示图片。我这里为了方便,采用同一幅图片作为默认图片
};
@Override
public int getCount() {
return arrayList.size();
}
@Override
public Object getItem(int position) {
return arrayList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
if (convertView == null) {
holder = new Holder();
convertView = layoutInflater.inflate(R.layout.ablum_item, parent, false);
holder.image = (ImageView) convertView.findViewById(R.id.image);
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.count = (TextView) convertView.findViewById(R.id.count);
convertView.setTag(holder);
}else {
holder = (Holder) convertView.getTag();
}
holder.count.setText(""+arrayList.get(position).getCount());
holder.name.setText(arrayList.get(position).getBucketName());
//图片加载器的使用代码,就这一句代码即可实现图片的加载。请注意这里的uri地址,因为我们现在实现的是获取本地图片,所以使用"file://"+图片的存储地址。如果要获取网络图片,这里的uri就是图片的网络地址。
imageLoader.displayImage("file://"+arrayList.get(position).getImageList().get(0).getImagePath(),
holder.image, options);
return convertView;
}
class Holder{
ImageView image;
TextView name;
TextView count;
}
//设置相册列表数据,主要用于把相册数据传递到Adapter中
public void setArrayList(List<PhotoUpImageBucket> arrayList) {
this.arrayList = arrayList;
}
}
整个相册列表的界面代码还是比较简单的。下一篇博文讲述android 获取相册列表的实现(三)
时间: 2024-10-18 17:11:17