先上效果图:
主要代码:
Adapter
package com.example.multiimagepick.ui;
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import com.example.multiimagepick.R;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
public class MultiImagePickAdapter extends BaseAdapter {
private Context context;
private ArrayList<String> list;
private ArrayList<Integer> selectedIndexs;
private OnSelectedCountChangedListener listener;
DisplayImageOptions options;
public interface OnSelectedCountChangedListener{
void onSelectedCountChanged(int count);
}
public MultiImagePickAdapter(Context context, ArrayList<String> list, OnSelectedCountChangedListener listener){
this.context = context;
setList(list);
selectedIndexs = new ArrayList<Integer>();
this.listener = listener;
options = new DisplayImageOptions.Builder()
// .showImageOnLoading(R.drawable.ic_stub)
// .showImageForEmptyUri(R.drawable.ic_empty)
// .showImageOnFail(R.drawable.ic_error)
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.bitmapConfig(Bitmap.Config.RGB_565)
//缩放到完全大小
.imageScaleType(ImageScaleType.EXACTLY)
//图像将被二次采样的整数倍(big)
//.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
//EXACTLY_STRETCHED:图片会缩放到目标大小完全
// .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
.build();
}
public void setList(ArrayList<String> list){
if(list == null){
this.list = new ArrayList<String>();
}else{
this.list = list;
}
}
@Override
public int getCount() {
return list.size();
}
@Override
public String getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
int currPos;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
View view = convertView;
currPos = position;
log("getView>>> viewIndex: " + position);
if(view == null){
view = LayoutInflater.from(context).inflate(R.layout.item_grid_image, null);
holder = new ViewHolder();
holder.imageView = (ImageView)view.findViewById(R.id.iv);
holder.checkBox = (CheckBox)view.findViewById(R.id.cb);
view.setTag(holder);
holder.checkBox.setOnCheckedChangeListener(new MyOnCheckedChangeListener(position));
}else{
holder = (ViewHolder)view.getTag();
holder.checkBox = (CheckBox)view.findViewById(R.id.cb);
holder.checkBox.setOnCheckedChangeListener(new MyOnCheckedChangeListener(position));
}
log("list: " + selectedIndexs.toString());
if(selectedIndexs.contains(position)){
holder.checkBox.setChecked(true);
log("---------------true: " + position);
}else{
holder.checkBox.setChecked(false);
log(">>>false: " + position);
}
String uri = getItem(position);
ImageLoader.getInstance().displayImage(uri, holder.imageView, options, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String arg0, View arg1) {
((ImageView)arg1).setImageBitmap(null);
}
@Override
public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {
}
@Override
public void onLoadingComplete(String arg0, View arg1, Bitmap arg2) {
// log("图片尺寸: " + arg2.getWidth() + "/ " +arg2.getHeight());
}
@Override
public void onLoadingCancelled(String arg0, View arg1) {
}
});
return view;
}
public ArrayList<String> getSelectedUri(){
ArrayList<String> rs = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
if(selectedIndexs == null || selectedIndexs.size() < 1){
log("没有选定的元素。");
return null;
}
for(int i : selectedIndexs){
sb.append(i).append(" ,");
rs.add(getItem(i));
}
log("选定的元素: " + sb.toString() + "。");
return rs;
}
static class ViewHolder {
ImageView imageView;
CheckBox checkBox;
}
class MyOnCheckedChangeListener implements OnCheckedChangeListener {
private int position;
public MyOnCheckedChangeListener(int position) {
// TODO Auto-generated constructor stub
this.position = position;
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
log("新选定: " + position);
//如果是选定
if(selectedIndexs.contains(position)){
return;
}else{
selectedIndexs.add(position);
onSelectedCountChanged();
}
}else{
//如果是取消选定
if(selectedIndexs.contains(position)){
selectedIndexs.remove(selectedIndexs.indexOf(position));
onSelectedCountChanged();
}else{
return;
}
}
}
};
private void log(String msg){
Log.i(this.getClass().getSimpleName(), msg);
}
private void onSelectedCountChanged(){
if(listener!=null){
if(selectedIndexs!=null){
listener.onSelectedCountChanged(selectedIndexs.size());
}
}
}
}
源码链接:
http://download.csdn.net/detail/gzjck/8604421