package com.ody.photopicker.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import com.ody.photopicker.PhotoPicker;
import com.ody.photopicker.R;
import com.ody.photopicker.entity.Photo;
import com.ody.photopicker.entity.PhotoDirectory;
import com.ody.photopicker.event.OnItemCheckListener;
import com.ody.photopicker.event.OnPhotoClickListener;
import com.ody.photopicker.utils.AndroidLifecycleUtils;
import com.ody.photopicker.utils.MediaStoreHelper;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Samuel on 15/5/31.
*/
public class PhotoGridAdapter extends SelectableAdapter<PhotoGridAdapter.PhotoViewHolder> {
private OnItemCheckListener onItemCheckListener = null;
private OnPhotoClickListener onPhotoClickListener = null;
private View.OnClickListener onCameraClickListener = null;
public final static int ITEM_TYPE_CAMERA = 100;
public final static int ITEM_TYPE_PHOTO = 101;
private final static int COL_NUMBER_DEFAULT = 3;
private boolean hasCamera = true;
private boolean previewEnable = true;
private int imageSize;
private int columnNumber = COL_NUMBER_DEFAULT;
public PhotoGridAdapter(Context context, List<PhotoDirectory> photoDirectories) {
this.photoDirectories = photoDirectories;
setColumnNumber(context, columnNumber);
}
public PhotoGridAdapter(Context context, List<PhotoDirectory> photoDirectories, ArrayList<String> orginalPhotos, int colNum) {
this(context, photoDirectories);
setColumnNumber(context, colNum);
selectedPhotos = new ArrayList<>();
if (orginalPhotos != null) selectedPhotos.addAll(orginalPhotos);
}
private void setColumnNumber(Context context, int columnNumber) {
this.columnNumber = columnNumber;
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(metrics);
int widthPixels = metrics.widthPixels;
imageSize = widthPixels / columnNumber;
}
@Override
public int getItemViewType(int position) {
return (showCamera() && position == 0) ? ITEM_TYPE_CAMERA : ITEM_TYPE_PHOTO;
}
@Override
public PhotoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.__picker_item_photo, parent, false);
final PhotoViewHolder holder = new PhotoViewHolder(itemView);
if (viewType == ITEM_TYPE_CAMERA) {
holder.vSelected.setVisibility(View.GONE);
holder.ivPhoto.setScaleType(ImageView.ScaleType.CENTER);
holder.ivPhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onCameraClickListener != null) {
onCameraClickListener.onClick(view);
}
}
});
}
return holder;
}
@Override
public void onBindViewHolder(final PhotoViewHolder holder, int position) {
if (getItemViewType(position) == ITEM_TYPE_PHOTO) {
List<Photo> photos = getCurrentPhotos();
final Photo photo;
if (showCamera()) {
photo = photos.get(position - 1);
} else {
photo = photos.get(position);
}
boolean canLoadImage = AndroidLifecycleUtils.canLoadImage(holder.ivPhoto.getContext());
if (canLoadImage) {
if (PhotoPicker.mImageLoader == null) throw new RuntimeException("请先设置图片加载器");
PhotoPicker.mImageLoader.displayImage(holder.ivPhoto, photo.getPath());
}
final boolean isChecked = isSelected(photo);
holder.vSelected.setSelected(isChecked);
holder.ivPhoto.setSelected(isChecked);
holder.ivPhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onPhotoClickListener != null) {
int pos = holder.getAdapterPosition();
if (previewEnable) {
onPhotoClickListener.onClick(view, pos, showCamera());
} else {
holder.vSelected.performClick();
}
}
}
});
holder.vSelected.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int pos = holder.getAdapterPosition();
boolean isEnable = true;
if (onItemCheckListener != null) {
isEnable = onItemCheckListener.onItemCheck(pos, photo,
getSelectedPhotos().size() + (isSelected(photo) ? -1 : 1));
}
if (isEnable) {
toggleSelection(photo);
notifyItemChanged(pos);
}
}
});
} else {
holder.ivPhoto.setImageResource(R.drawable.__picker_camera);
}
}
@Override
public int getItemCount() {
int photosCount =
photoDirectories.size() == 0 ? 0 : getCurrentPhotos().size();
if (showCamera()) {
return photosCount + 1;
}
return photosCount;
}
public static class PhotoViewHolder extends RecyclerView.ViewHolder {
private ImageView ivPhoto;
private View vSelected;
public PhotoViewHolder(View itemView) {
super(itemView);
ivPhoto = (ImageView) itemView.findViewById(R.id.iv_photo);
vSelected = itemView.findViewById(R.id.v_selected);
}
}
public void setOnItemCheckListener(OnItemCheckListener onItemCheckListener) {
this.onItemCheckListener = onItemCheckListener;
}
public void setOnPhotoClickListener(OnPhotoClickListener onPhotoClickListener) {
this.onPhotoClickListener = onPhotoClickListener;
}
public void setOnCameraClickListener(View.OnClickListener onCameraClickListener) {
this.onCameraClickListener = onCameraClickListener;
}
public ArrayList<String> getSelectedPhotoPaths() {
ArrayList<String> selectedPhotoPaths = new ArrayList<>(getSelectedItemCount());
for (String photo : selectedPhotos) {
selectedPhotoPaths.add(photo);
}
return selectedPhotoPaths;
}
public void setShowCamera(boolean hasCamera) {
this.hasCamera = hasCamera;
}
public void setPreviewEnable(boolean previewEnable) {
this.previewEnable = previewEnable;
}
public boolean showCamera() {
return (hasCamera && currentDirectoryIndex == MediaStoreHelper.INDEX_ALL_PHOTOS);
}
@Override
public void onViewRecycled(PhotoViewHolder holder) {
if (PhotoPicker.mImageLoader == null) throw new RuntimeException("请先设置图片加载器");
PhotoPicker.mImageLoader.clear(holder.ivPhoto);
super.onViewRecycled(holder);
}
}