该项目实现的功能如下:
获取手机相册,点击每个相册之后进入该相册的图片列表界面,在图片列表界面可以实现图片多选,然后进入所选择的图片界面,在该界面内可以实现所选图片的上传等功能。
该项目最大特色:
1、获取相册列表,目前网络上面介绍获取相册的项目很少,本文专门讲述相册的获取。
2、使用Android-Universal-Image-Loader集成框架-第三方jar包加载本地图片,熟悉这个jar的开发者肯定不陌生,该jar包十分强大,除了可以获取网络图片,本地图片也是可以的。同时,通过引用第三方jar可以有效解决OOM异常问题。
本篇博文接上面两篇博文
android 获取相册列表的实现及源码下载(一)
android 获取相册列表的实现及源码下载(二)
android获取相册列表的实现及源码下载(四)
继续讲述相册内图片列表界面的实现,首先给出相册列表界面Acitivity类代码:
public class AlbumItemActivity extends Activity implements OnClickListener{ private GridView gridView; private TextView back,ok; private PhotoUpImageBucket photoUpImageBucket; private ArrayList<PhotoUpImageItem> selectImages; private AlbumItemAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.album_item_images); init(); setListener(); } private void init(){ gridView = (GridView) findViewById(R.id.album_item_gridv); back = (TextView) findViewById(R.id.back); ok = (TextView) findViewById(R.id.sure); selectImages = new ArrayList<PhotoUpImageItem>(); Intent intent = getIntent(); photoUpImageBucket = (PhotoUpImageBucket) intent.getSerializableExtra("imagelist"); adapter = new AlbumItemAdapter(photoUpImageBucket.getImageList(), AlbumItemActivity.this); gridView.setAdapter(adapter); } private void setListener(){ back.setOnClickListener(this); ok.setOnClickListener(this); gridView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { CheckBox checkBox = (CheckBox) view.findViewById(R.id.check); photoUpImageBucket.getImageList().get(position).setSelected( !checkBox.isChecked()); adapter.notifyDataSetChanged(); if (photoUpImageBucket.getImageList().get(position).isSelected()) { if (selectImages.contains(photoUpImageBucket.getImageList().get(position))) { }else { selectImages.add(photoUpImageBucket.getImageList().get(position)); } }else { if (selectImages.contains(photoUpImageBucket.getImageList().get(position))) { selectImages.remove(photoUpImageBucket.getImageList().get(position)); }else { } } } }); } @Override protected void onDestroy() { super.onDestroy(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.back: finish(); break; case R.id.sure: Intent intent = new Intent(AlbumItemActivity.this,SelectedImagesActivity.class); intent.putExtra("selectIma", selectImages); startActivity(intent); break; default: break; } }}
下面给出适配器代码:
public class AlbumItemAdapter extends BaseAdapter { private List<PhotoUpImageItem> list;//存放所选相册里面的图片列表 private LayoutInflater layoutInflater; private ImageLoader imageLoader;//图片加载器 private DisplayImageOptions options;//图片加载器的设置 public AlbumItemAdapter(List<PhotoUpImageItem> list,Context context){ this.list = list; layoutInflater = LayoutInflater.from(context); imageLoader = ImageLoader.getInstance(); // 使用DisplayImageOption.Builder()创建DisplayImageOptions options = new DisplayImageOptions.Builder() .showStubImage(R.drawable.album_default_loading_pic) // 设置图片下载期间显示的图片 .showImageForEmptyUri(R.drawable.album_default_loading_pic) // 设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.drawable.album_default_loading_pic) // 设置图片加载或解码过程中发生错误显示的图片 .cacheInMemory(true) // 设置下载的图片是否缓存在内存中 .cacheOnDisc(true) // 设置下载的图片是否缓存在SD卡中 // .displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片 .bitmapConfig(Config.ARGB_8888) .imageScaleType(ImageScaleType.IN_SAMPLE_INT) .build(); // 创建配置过的DisplayImageOption对象 } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.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) { convertView = layoutInflater.inflate(R.layout.album_item_images_item_view, parent, false); holder = new Holder(); holder.imageView = (ImageView) convertView.findViewById(R.id.image_item); holder.checkBox = (CheckBox) convertView.findViewById(R.id.check); convertView.setTag(holder); }else { holder = (Holder) convertView.getTag(); } //图片加载器的使用代码,就这一句代码即可实现图片的加载。请注意 //这里的uri地址,因为我们现在实现的是获取本地图片,所以使 //用"file://"+图片的存储地址。如果要获取网络图片, //这里的uri就是图片的网络地址。 imageLoader.displayImage("file://"+list.get(position).getImagePath(), holder.imageView, options); holder.checkBox.setChecked(list.get(position).isSelected()); return convertView; } class Holder{ ImageView imageView; CheckBox checkBox; }}
图片列表界面的适配器比较简单,获取数据之后进行加载即可。这里面用到了相册对象类PhotoUpImageBucket,该类代码如下:
/** * 一个目录下的相册对象 */public class PhotoUpImageBucket implements Serializable{ public int count = 0; public String bucketName; public List<PhotoUpImageItem> imageList; public int getCount() { return count; } public void setCount(int count) { this.count = count; } public String getBucketName() { return bucketName; } public void setBucketName(String bucketName) { this.bucketName = bucketName; } public List<PhotoUpImageItem> getImageList() { return imageList; } public void setImageList(List<PhotoUpImageItem> imageList) { this.imageList = imageList; }}
同时代码中也是用到了图片对象类PhotoUpImageItem,该类代码如下:
public class PhotoUpImageItem implements Serializable { //图片ID private String imageId; //原图路径 private String imagePath; //是否被选择 private boolean isSelected = false; public String getImageId() { return imageId; } public void setImageId(String imageId) { this.imageId = imageId; } public String getImagePath() { return imagePath; } public void setImagePath(String imagePath) { this.imagePath = imagePath; } public boolean isSelected() { return isSelected; } public void setSelected(boolean isSelected) { this.isSelected = isSelected; }}
把每个相册和每个图片创建为对象方便维护和更加简便的开发,如果后期增加什么功能,在对象的基础上开发会很大程度上带来方便。
另外两篇博文链接:
android 获取相册列表的实现及源码下载(一)
android 获取相册列表的实现及源码下载(二)
android获取相册列表的实现及源码下载(四)
源码下载