package me.nereo.multi_image_selector.adapter; import android.content.Context; import android.graphics.Point; import android.os.Build; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.BaseAdapter; import android.widget.ImageView; import com.squareup.picasso.Picasso; import java.io.File; import java.util.ArrayList; import java.util.List; import me.nereo.multi_image_selector.MultiImageSelectorFragment; import me.nereo.multi_image_selector.R; import me.nereo.multi_image_selector.bean.Image; /** * 图片Adapter * Created by Nereo on 2015/4/7. * Updated by nereo on 2016/1/19. */ public class ImageGridAdapter extends BaseAdapter { private static final int TYPE_CAMERA = 0; private static final int TYPE_NORMAL = 1; private Context mContext; private LayoutInflater mInflater; private boolean showCamera = true; private boolean showSelectIndicator = true; private List mImages = new ArrayList<>(); private List mSelectedImages = new ArrayList<>(); final int mGridWidth; public ImageGridAdapter(Context context, boolean showCamera, int column){ mContext = context; mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.showCamera = showCamera; WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); int width = 0; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { Point size = new Point(); wm.getDefaultDisplay().getSize(size); width = size.x; }else{ width = wm.getDefaultDisplay().getWidth(); } mGridWidth = width / column; } /** * 显示选择指示器 * @param b */ public void showSelectIndicator(boolean b) { showSelectIndicator = b; } public void setShowCamera(boolean b){ if(showCamera == b) return; showCamera = b; notifyDataSetChanged(); } public boolean isShowCamera(){ return showCamera; } /** * 选择某个图片,改变选择状态 * @param image */ public void select(Image image) { if(mSelectedImages.contains(image)){ mSelectedImages.remove(image); }else{ mSelectedImages.add(image); } notifyDataSetChanged(); } /** * 通过图片路径设置默认选择 * @param resultList */ public void setDefaultSelected(ArrayList resultList) { for(String path : resultList){ Image image = getImageByPath(path); if(image != null){ mSelectedImages.add(image); } } if(mSelectedImages.size() > 0){ notifyDataSetChanged(); } } private Image getImageByPath(String path){ if(mImages != null && mImages.size()>0){ for(Image image : mImages){ if(image.path.equalsIgnoreCase(path)){ return image; } } } return null; } /** * 设置数据集 * @param images */ public void setData(List images) { mSelectedImages.clear(); if(images != null && images.size()>0){ mImages = images; }else{ mImages.clear(); } notifyDataSetChanged(); } @Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { if(showCamera){ return position==0 ? TYPE_CAMERA : TYPE_NORMAL; } return TYPE_NORMAL; } @Override public int getCount() { return showCamera ? mImages.size()+1 : mImages.size(); } @Override public Image getItem(int i) { if(showCamera){ if(i == 0){ return null; } return mImages.get(i-1); }else{ return mImages.get(i); } } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { if(isShowCamera()){ if(i == 0){ view = mInflater.inflate(R.layout.mis_list_item_camera, viewGroup, false); return view; } } ViewHolder holder; if(view == null){ view = mInflater.inflate(R.layout.mis_list_item_image, viewGroup, false); holder = new ViewHolder(view); }else{ holder = (ViewHolder) view.getTag(); } if(holder != null) { holder.bindData(getItem(i)); } return view; } class ViewHolder { ImageView image; ImageView indicator; View mask; ViewHolder(View view){ image = (ImageView) view.findViewById(R.id.image); indicator = (ImageView) view.findViewById(R.id.checkmark); mask = view.findViewById(R.id.mask); view.setTag(this); } void bindData(final Image data){ if(data == null) return; // 处理单选和多选状态 if(showSelectIndicator){ indicator.setVisibility(View.VISIBLE); if(mSelectedImages.contains(data)){ // 设置选中状态 indicator.setImageResource(R.drawable.mis_btn_selected); mask.setVisibility(View.VISIBLE); }else{ // 未选择 indicator.setImageResource(R.drawable.mis_btn_unselected); mask.setVisibility(View.GONE); } }else{ indicator.setVisibility(View.GONE); } File imageFile = new File(data.path); if (imageFile.exists()) { // 显示图片 Picasso.get() .load(imageFile) .placeholder(R.drawable.mis_default_error) .tag(MultiImageSelectorFragment.TAG) .resize(mGridWidth, mGridWidth) .centerCrop() .into(image); }else{ image.setImageResource(R.drawable.mis_default_error); } } } }