一、Adapter
public class RecyclerImageAdapter extends RecyclerView.Adapter<RecyclerImageAdapter.ViewHolder> {
public static final int TYPE_CAMERA = 1;
public static final int TYPE_PICTURE = 2;
private LayoutInflater mInflater;
private List<String> list = new ArrayList<>();
private int selectMax = 9;
private Context context;
private final RequestOptions options;
/**
* 点击添加图片跳转
*/
private OnPickerListener mOnPickerListener;
public void setOnPickerListener(OnPickerListener onPickerListener) {
this.mOnPickerListener = onPickerListener;
}
/**
* recyclerView设置的监听接口
*/
public interface OnPickerListener {
void onPicker(int position);
}
public RecyclerImageAdapter(Context context) {
this.context = context;
mInflater = LayoutInflater.from(context);
options = new RequestOptions().placeholder(R.drawable.icon_choose_picture);
}
public void setSelectMax(int selectMax) {
this.selectMax = selectMax;
}
public void setList(List<String> list) {
this.list = list;
this.notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
ImageView iv_image, iv_delete;
public ViewHolder(View view) {
super(view);
iv_image = view.findViewById(R.id.iv_image);
iv_delete = view.findViewById(R.id.iv_delete);
iv_delete.setOnClickListener(this);
iv_image.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.iv_image:
mOnPickerListener.onPicker(getLayoutPosition());
break;
case R.id.iv_delete:
list.remove(getLayoutPosition());
notifyItemRemoved(getLayoutPosition());
break;
}
}
}
@Override
public int getItemCount() {
if (list.size() < selectMax) {
return list.size() + 1;
} else {
return list.size();
}
}
public List<String> getList() {
return list;
}
@Override
public int getItemViewType(int position) {
if (isShowAddItem(position)) {
return TYPE_CAMERA;
} else {
return TYPE_PICTURE;
}
}
/**
* 创建ViewHolder
*/
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = mInflater.inflate(R.layout.item_add_pic, viewGroup, false);
final ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
private boolean isShowAddItem(int position) {
int size = list.size() == 0 ? 0 : list.size();
return position == size;
}
/**
* 设置值
*/
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
//少于9张,显示继续添加的图标
if (getItemViewType(position) == TYPE_CAMERA) {
viewHolder.iv_image.setImageBitmap(BitmapFactory.decodeResource(context.getResources(),R.drawable.icon_choose_picture));
viewHolder.iv_delete.setVisibility(View.INVISIBLE);
} else {
String imgUrl = list.get(position);
Glide.with(context).load(new File(imgUrl)).apply(options).into(viewHolder.iv_image);
viewHolder.iv_delete.setVisibility(View.VISIBLE);
}
}
}
二、Activity
public class SelectPhotoActivity extends MyTakePhotoActivity {
private RecyclerView rv_photo;
private RecyclerImageAdapter mRecyclerAdapter;
private Uri imageUri;
private ArrayList<String> imgUrlLists = new ArrayList<>();// 图片压缩后的地址
@Override
public int initLayout() {
return R.layout.activity_select_photo;
}
@Override
public void initData() {
rv_photo = findViewById(R.id.rv_photo);
rv_photo.setLayoutManager(new GridLayoutManager(this, 3));
rv_photo.addItemDecoration(new MyPaddingDecoration(this));
mRecyclerAdapter = new RecyclerImageAdapter(this);
mRecyclerAdapter.setSelectMax(9);
rv_photo.setAdapter(mRecyclerAdapter);
mRecyclerAdapter.setOnPickerListener(position -> {
if (imgUrlLists.size() != position) {
String[] strings = new String[imgUrlLists.size()];
imageBrower(position, imgUrlLists.toArray(strings));
} else {
showPopupWindow();
}
});
}
private void imageBrower(int position, String[] urls) {
Intent intent = new Intent(this, ImagePagerActivity.class);
intent.putExtra(ImagePagerActivity.EXTRA_IMAGE_URLS, urls);
intent.putExtra(ImagePagerActivity.EXTRA_IMAGE_INDEX, position);
this.startActivity(intent);
}
/**
* 设置照片的一些配置
*/
private void photoConfig() {
File file = new File(Environment.getExternalStorageDirectory(), "/napp_base/" + System.currentTimeMillis() + ".jpg");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
imageUri = Uri.fromFile(file);
/**
* 压缩配置
* 设置压缩规则,最大300kb
* enableReserveRaw是否保存原图
*/
getTakePhoto().onEnableCompress(new CompressConfig.Builder().setMaxSize(300 * 1024).enableReserveRaw(false).create(), false);
}
@Override
public void takeSuccess(TResult result, int id) {
super.takeSuccess(result, id);
ArrayList<TImage> images = result.getImages();
for (int i = 0; i < images.size(); i++) {
imgUrlLists.add(images.get(i).getCompressPath());
}
mRecyclerAdapter.setList(imgUrlLists);
}
@Override
public void takeFail(TResult result, String msg) {
super.takeFail(result, msg);
}
@Override
public void takeCancel() {
super.takeCancel();
}
/**
* 弹出选择
*/
private void showPopupWindow() {
TakePhotoPopWindow popupWindow = new TakePhotoPopWindow(this);
String[] str = {"拍照", "从相册中选择"};
popupWindow.showPopupWindowForFoot(str, (text, position) -> {
switch (position) {
case 0://拍照
photoConfig();
getTakePhoto().onPickFromCapture(imageUri);
break;
case 1://相册
photoConfig();
getTakePhoto().onPickMultiple(9 - mRecyclerAdapter.getList().size());
break;
}
});
}
public class MyPaddingDecoration extends RecyclerView.ItemDecoration {
private int divider;
public MyPaddingDecoration(Context context) {
//即你要设置的分割线的宽度 --这里设为10dp
divider = context.getResources().getDimensionPixelSize(R.dimen.divider);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
// outRect.left = divider; //相当于 设置 left padding
// outRect.top = divider; //相当于 设置 top padding
// outRect.right = divider; //相当于 设置 right padding
outRect.bottom = divider; //相当于 设置 bottom padding
}
}
}
三、布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_photo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="15dp"
android:overScrollMode="never"
android:visibility="visible" />
</LinearLayout>
四、引用工程
TakePhoto-master
五、资源文件
资源链接