PictureSelector原项目地址

相册全白是因为在初始化的过程中缺少了一样设置

.loadImageEngine(GlideEngine.createGlideEngine())

想要微信那样的效果不要忘记加下面这句代码

.isWeChatStyle(true)//是否设置微信样式

添加PictureSelector api

api 'com.github.LuckSiege.PictureSelector:picture_library:v2.5.9'

6.0以上打开相册是需要动态申请权限的,下面两个添加一个就ok(推荐使用第一个)

//rxpermission(配套rxjava使用的)
api 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar'
//rxpermission
api 'com.github.tbruyelle:rxpermissions:0.10.2'

我把我的代码全粘来了,可以根据自己需求挑着用

Activity使用

public class FssActivity extends BaseActivity implements ViewI {@BindView(R.id.myActionBar)CustomActionBar myActionBar;@BindView(R.id.rv_fss)RecyclerView rvFss;@BindView(R.id.tv_delete_text)TextView tvDeleteText;@BindView(R.id.ed_content)EditText edContent;private GridImageAdapter mAdapter;private int maxSelectNum = 6;private PresenterImpl presenter;private String content;String path = "";private boolean noUp = false;private boolean needScaleBig = true;private boolean needScaleSmall = true;private boolean isUpward;private ItemTouchHelper mItemTouchHelper;private DragListener mDragListener;@Overridepublic int initLayout() {return R.layout.activity_fss;}@Overridepublic void initView() {ButterKnife.bind(this);presenter = new PresenterImpl(FssActivity.this);myActionBar.setBarCenter("发表说说", 0, null);myActionBar.setBarRightFb(true, new View.OnClickListener() {@Overridepublic void onClick(View v) {if (noUp) {ToastUtils.show("您选择的图片中含有不支持的图片类型,请重新选择。");} else {content = edContent.getText().toString();if (content.isEmpty()) {ToastUtils.show("发表内容不能为空");} /*else if (path.length() == 0) {ToastUtils.show("至少选择一张照片");} */ else {Map<String, Object> map = new HashMap<>();map.put("content", content);if (path.length() != 0) {String s = path.substring(0, path.length() - 1);String[] url = {s};if (s.contains("mp4")) {map.put("type", 1);} else {map.put("type", 0);}map.put("urls", url);} else {map.put("type", 0);}presenter.postbody(ApiConstant.MOMENTS_URL, map, GmBean.class);}}}});myActionBar.setBarRightQx(true, new View.OnClickListener() {@Overridepublic void onClick(View v) {finish();}});}@Overridepublic void initData() {rvFss.setLayoutManager(new GridLayoutManager(this, 3));rvFss.addItemDecoration(new GridSpacingItemDecoration(3, 20, false));mAdapter = new GridImageAdapter(this);mAdapter.setSelectMax(maxSelectNum);rvFss.setAdapter(mAdapter);mAdapter.setAddPicClickListener(new GridImageAdapter.onAddPicClickListener() {@Overridepublic void onAddPicClick() {//拍摄 录视频 从相册中选取pop//cameraPhotoPop();//从相册中选取图片selectPicture();}});mAdapter.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(View v, int position) {List<LocalMedia> selectList = mAdapter.getData();if (selectList.size() > 0) {LocalMedia media = selectList.get(position);String mimeType = media.getMimeType();int mediaType = PictureMimeType.getMimeType(mimeType);switch (mediaType) {case PictureConfig.TYPE_VIDEO:// 预览视频PictureSelector.create(FssActivity.this).themeStyle(R.style.picture_WeChat_style).externalPictureVideo(TextUtils.isEmpty(media.getAndroidQToPath()) ? media.getPath() : media.getAndroidQToPath());break;case PictureConfig.TYPE_AUDIO:/*// 预览音频PictureSelector.create(FssActivity.this).externalPictureAudio(PictureMimeType.isContent(media.getPath()) ? media.getAndroidQToPath() : media.getPath());*/break;default://预览图片PictureSelector.create(FssActivity.this).themeStyle(R.style.picture_WeChat_style).isNotPreviewDownload(true).loadImageEngine(GlideEngine.createGlideEngine()).openExternalPreview(position, selectList);break;}}}});//拖拽删除mAdapter.setItemLongClickListener((holder, position, v) -> {//如果item不是最后一个,则执行拖拽needScaleBig = true;needScaleSmall = true;int size = mAdapter.getData().size();if (size != maxSelectNum) {mItemTouchHelper.startDrag(holder);return;}if (holder.getLayoutPosition() != size - 1) {mItemTouchHelper.startDrag(holder);}});mDragListener = new DragListener() {@Overridepublic void deleteState(boolean isDelete) {if (isDelete) {tvDeleteText.setText(getString(R.string.app_let_go_drag_delete));tvDeleteText.setCompoundDrawablesRelativeWithIntrinsicBounds(0, R.mipmap.ic_let_go_delete, 0, 0);} else {tvDeleteText.setText(getString(R.string.app_drag_delete));tvDeleteText.setCompoundDrawablesRelativeWithIntrinsicBounds(0, R.mipmap.picture_icon_delete, 0, 0);}}@Overridepublic void dragState(boolean isStart) {int visibility = tvDeleteText.getVisibility();if (isStart) {if (visibility == View.GONE) {tvDeleteText.animate().alpha(1).setDuration(300).setInterpolator(new AccelerateInterpolator());tvDeleteText.setVisibility(View.VISIBLE);}} else {if (visibility == View.VISIBLE) {tvDeleteText.animate().alpha(0).setDuration(300).setInterpolator(new AccelerateInterpolator());tvDeleteText.setVisibility(View.GONE);}}}};mItemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {@Overridepublic boolean isLongPressDragEnabled() {return true;}@Overridepublic void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {}@Overridepublic int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {int itemViewType = viewHolder.getItemViewType();if (itemViewType != GridImageAdapter.TYPE_CAMERA) {viewHolder.itemView.setAlpha(0.7f);}return makeMovementFlags(ItemTouchHelper.DOWN | ItemTouchHelper.UP| ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT, 0);}@Overridepublic boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {//得到item原来的positiontry {int fromPosition = viewHolder.getAdapterPosition();//得到目标positionint toPosition = target.getAdapterPosition();int itemViewType = target.getItemViewType();if (itemViewType != GridImageAdapter.TYPE_CAMERA) {if (fromPosition < toPosition) {for (int i = fromPosition; i < toPosition; i++) {Collections.swap(mAdapter.getData(), i, i + 1);}} else {for (int i = fromPosition; i > toPosition; i--) {Collections.swap(mAdapter.getData(), i, i - 1);}}mAdapter.notifyItemMoved(fromPosition, toPosition);}} catch (Exception e) {e.printStackTrace();}return true;}@Overridepublic void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView,@NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {int itemViewType = viewHolder.getItemViewType();if (itemViewType != GridImageAdapter.TYPE_CAMERA) {if (null == mDragListener) {return;}if (needScaleBig) {//如果需要执行放大动画viewHolder.itemView.animate().scaleXBy(0.1f).scaleYBy(0.1f).setDuration(100);//执行完成放大动画,标记改掉needScaleBig = false;//默认不需要执行缩小动画,当执行完成放大 并且松手后才允许执行needScaleSmall = false;}int sh = recyclerView.getHeight() + tvDeleteText.getHeight();int ry = tvDeleteText.getBottom() - sh;if (dY >= ry) {//拖到删除处mDragListener.deleteState(true);if (isUpward) {//在删除处放手,则删除itemviewHolder.itemView.setVisibility(View.INVISIBLE);mAdapter.delete(viewHolder.getAdapterPosition());resetState();return;}} else {//没有到删除处if (View.INVISIBLE == viewHolder.itemView.getVisibility()) {//如果viewHolder不可见,则表示用户放手,重置删除区域状态mDragListener.dragState(false);}if (needScaleSmall) {//需要松手后才能执行viewHolder.itemView.animate().scaleXBy(1f).scaleYBy(1f).setDuration(100);}mDragListener.deleteState(false);}super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);}}@Overridepublic void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {int itemViewType = viewHolder != null ? viewHolder.getItemViewType() : GridImageAdapter.TYPE_CAMERA;if (itemViewType != GridImageAdapter.TYPE_CAMERA) {if (ItemTouchHelper.ACTION_STATE_DRAG == actionState && mDragListener != null) {mDragListener.dragState(true);}super.onSelectedChanged(viewHolder, actionState);}}@Overridepublic long getAnimationDuration(@NonNull RecyclerView recyclerView, int animationType, float animateDx, float animateDy) {needScaleSmall = true;isUpward = true;return super.getAnimationDuration(recyclerView, animationType, animateDx, animateDy);}@Overridepublic void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {int itemViewType = viewHolder.getItemViewType();if (itemViewType != GridImageAdapter.TYPE_CAMERA) {viewHolder.itemView.setAlpha(1.0f);super.clearView(recyclerView, viewHolder);mAdapter.notifyDataSetChanged();resetState();}}});// 绑定拖拽事件mItemTouchHelper.attachToRecyclerView(rvFss);// 注册广播BroadcastManager.getInstance(FssActivity.this).registerReceiver(broadcastReceiver,BroadcastAction.ACTION_DELETE_PREVIEW_POSITION);}private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (TextUtils.isEmpty(action)) {return;}if (BroadcastAction.ACTION_DELETE_PREVIEW_POSITION.equals(action)) {// 外部预览删除按钮回调Bundle extras = intent.getExtras();if (extras != null) {int position = extras.getInt(PictureConfig.EXTRA_PREVIEW_DELETE_POSITION);ToastUtils.show("delete image index:" + position);mAdapter.remove(position);mAdapter.notifyItemRemoved(position);}}}};@Overrideprotected void onDestroy() {super.onDestroy();if (broadcastReceiver != null) {BroadcastManager.getInstance(FssActivity.this).unregisterReceiver(broadcastReceiver,BroadcastAction.ACTION_DELETE_PREVIEW_POSITION);}}/*** 重置*/private void resetState() {if (mDragListener != null) {mDragListener.deleteState(false);mDragListener.dragState(false);}isUpward = false;}public void cameraPhotoPop() {View view1 = getLayoutInflater().inflate(R.layout.camera_photo_pop, null);final Dialog dialog = new Dialog(this, R.style.style_dialog);dialog.setContentView(view1);dialog.show();Window window = dialog.getWindow();window.setGravity(Gravity.BOTTOM); //可设置dialog的位置window.getDecorView().setPadding(0, 0, 0, 0); //消除边距WindowManager.LayoutParams lp = window.getAttributes();lp.width = WindowManager.LayoutParams.MATCH_PARENT;   //设置宽度充满屏幕lp.height = WindowManager.LayoutParams.WRAP_CONTENT;window.setAttributes(lp);view1.findViewById(R.id.tv_cancle).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {dialog.dismiss();}});view1.findViewById(R.id.tv_photo).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {selectPicture();dialog.dismiss();}});view1.findViewById(R.id.tv_camera).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {camera();dialog.dismiss();}});view1.findViewById(R.id.tv_video).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {video();dialog.dismiss();}});}//拍摄public void camera() {PictureSelector.create(this).openCamera(PictureMimeType.ofImage()).loadImageEngine(GlideEngine.createGlideEngine()).selectionData(mAdapter.getData())// 是否传入已选图片.forResult(PictureConfig.CHOOSE_REQUEST);}//录视频public void video() {PictureSelector.create(this).openCamera(PictureMimeType.ofVideo()).loadImageEngine(GlideEngine.createGlideEngine()).selectionData(mAdapter.getData())// 是否传入已选图片.recordVideoSecond(10)//录制视频秒数 默认60s.forResult(PictureConfig.CHOOSE_REQUEST);}//从相册中选取private void selectPicture() {PictureSelector.create(FssActivity.this).openGallery(PictureMimeType.ofAll())//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio().loadImageEngine(GlideEngine.createGlideEngine())//外部传入图片加载引擎,必传项.theme(R.style.picture_WeChat_style)//样式.isWeChatStyle(true)//是否设置微信样式.isMultipleSkipCrop(true)//多图裁剪是否支持跳过.maxSelectNum(maxSelectNum)//图片最大选择数量.minSelectNum(1)//图片最小选择数量.imageSpanCount(3)//列表每行显示个数.selectionMode(PictureConfig.MULTIPLE)//单选or多选 PictureConfig.SINGLE PictureConfig.MULTIPLE//.imageFormat(PictureMimeType.PNG)//拍照图片格式后缀,默认jpeg.synOrAsy(true)//开启同步or异步压缩.selectionData(mAdapter.getData())// 是否传入已选图片.maxVideoSelectNum(1)//视频最大选择数量.isCamera(false).recordVideoSecond(10)//录制视频秒数 默认60s.videoMaxSecond(10)// 查询多少秒以内的视频.videoMinSecond(3)// 查询多少秒以内的视频.compress(true)//是否压缩//.isCamera(true)//列表是否显示拍照按钮.forResult(PictureConfig.CHOOSE_REQUEST);}//打开相册的结果回调@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK) {switch (requestCode) {case PictureConfig.CHOOSE_REQUEST:// 图片选择结果回调// 例如 LocalMedia 里面返回三种 path// 1.media.getPath(); 为原图 path// 2.media.getCutPath();为裁剪后 path,需判断 media.isCut();是否为 true// 3.media.getCompressPath();为压缩后 path,需判断 media.isCompressed();是否为 true// 如果裁剪并压缩了,以取压缩路径为准,因为是先裁剪后压缩的\List<LocalMedia> mImageList = PictureSelector.obtainMultipleResult(data);for (int i = 0; i < mImageList.size(); i++) {if (mImageList.get(i).isCompressed()) {path = mImageList.get(i).getCompressPath() + ",";} else {path = mImageList.get(i).getRealPath() + ",";}}mAdapter.setList(mImageList);mAdapter.notifyDataSetChanged();LocalMedia media = mImageList.get(0);String mimeType = media.getMimeType();int mediaType = PictureMimeType.getMimeType(mimeType);if (mediaType == PictureConfig.TYPE_VIDEO) {mAdapter.selectMax = 1;} else if (mediaType == PictureConfig.TYPE_IMAGE) {mAdapter.selectMax = 6;}break;default:break;}}}/*** 循环压缩*/private static byte[] compressBitmap(Bitmap frame, int limit) {if (frame != null && limit > 0) {ByteArrayOutputStream baos = new ByteArrayOutputStream();int options = 100;frame.compress(Bitmap.CompressFormat.JPEG, options, baos);while (baos.toByteArray().length > limit * 1024) {baos.reset();options -= 5;frame.compress(Bitmap.CompressFormat.JPEG, options, baos);}byte[] bytes = baos.toByteArray();if (baos != null) {try {baos.close();} catch (IOException e) {e.printStackTrace();}baos = null;}return bytes;}return null;}/*** 截取视频文件的封面图** @param filePath* @return*/@SuppressLint("RestrictedApi")public static LiveData<String> generateVideoCover(final String filePath) {final MutableLiveData<String> liveData = new MutableLiveData<>();ArchTaskExecutor.getIOThreadExecutor().execute(new Runnable() {@Overridepublic void run() {MediaMetadataRetriever retriever = new MediaMetadataRetriever();retriever.setDataSource(filePath);//bugfix:此处应该使用{getFrameAtTime} 获取默认的第一个关键帧,手快写错Bitmap frame = retriever.getFrameAtTime();FileOutputStream fos = null;if (frame != null) {//压缩到200k以下,再存储到本地文件中byte[] bytes = compressBitmap(frame, 200);File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), System.currentTimeMillis() + ".jpeg");try {file.createNewFile();fos = new FileOutputStream(file);fos.write(bytes);liveData.postValue(file.getAbsolutePath());} catch (IOException e) {e.printStackTrace();} finally {if (fos != null) {try {fos.flush();fos.close();fos = null;} catch (IOException ignore) {ignore.printStackTrace();}}}} else {liveData.postValue(null);}}});return liveData;}@Overridepublic void success(Object data) {if (data instanceof GmBean) {GmBean gmBean = (GmBean) data;if (gmBean.getCode() == ApiConstant.SUCCEDCODE) {ToastUtils.show("发表成功");finish();/*if (uploadBean.getMessage().equals("未知图片类型")) {noUp = true;ToastUtils.show("您选择的图片中含有不支持的图片类型,请重新选择。");}*/} else {ToastUtils.show(gmBean.getMessage());}}}@Overridepublic void error(Object error) {LogUtils.e(error.toString());}
}

activity布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"android:orientation="vertical"><com.zbzl.custom.CustomActionBarandroid:id="@+id/myActionBar"android:layout_width="match_parent"android:layout_height="wrap_content" /><Viewandroid:id="@+id/vv"android:layout_width="match_parent"android:layout_height="10dp"android:layout_below="@+id/myActionBar"android:background="@color/fgx" /><EditTextandroid:id="@+id/ed_content"android:layout_width="match_parent"android:layout_height="145dp"android:layout_below="@+id/vv"android:layout_marginLeft="12dp"android:layout_marginTop="12dp"android:layout_marginRight="17dp"android:background="@null"android:gravity="start"android:hint="分享校园精彩..."android:padding="5dp"android:textSize="15sp" /><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/ed_content"android:clipChildren="false"><TextViewandroid:id="@+id/tv_delete_text"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:background="@color/app_color_red"android:drawableTop="@drawable/picture_icon_delete"android:drawablePadding="5dp"android:gravity="center"android:paddingTop="8dp"android:paddingBottom="8dp"android:text="@string/app_drag_delete"android:textColor="@color/white"android:textSize="12sp"android:visibility="gone"tools:visibility="visible" /><Viewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignTop="@+id/rv_fss"android:layout_alignBottom="@+id/rv_fss"android:background="@color/white" /><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rv_fss"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="12dp"android:layout_marginTop="5dp"android:layout_marginRight="12dp"android:overScrollMode="never" /></RelativeLayout>
</RelativeLayout>

Adapter

public class GridImageAdapter extendsRecyclerView.Adapter<GridImageAdapter.ViewHolder> {public static final String TAG = "PictureSelector";public static final int TYPE_CAMERA = 1;public static final int TYPE_PICTURE = 2;private LayoutInflater mInflater;private List<LocalMedia> list = new ArrayList<>();public int selectMax = 6;/*** 删除*/public void delete(int position) {try {if (position != RecyclerView.NO_POSITION && list.size() > position) {list.remove(position);notifyItemRemoved(position);notifyItemRangeChanged(position, list.size());}} catch (Exception e) {e.printStackTrace();}}public GridImageAdapter(Context context) {this.mInflater = LayoutInflater.from(context);}public void setSelectMax(int selectMax) {this.selectMax = selectMax;}public void setList(List<LocalMedia> list) {this.list = list;}public List<LocalMedia> getData() {return list == null ? new ArrayList<>() : list;}public void remove(int position) {if (list != null && position < list.size()) {list.remove(position);}}public class ViewHolder extends RecyclerView.ViewHolder {ImageView mImg;ImageView mIvDel;TextView tvDuration;public ViewHolder(View view) {super(view);mImg = view.findViewById(R.id.fiv);mIvDel = view.findViewById(R.id.iv_del);tvDuration = view.findViewById(R.id.tv_duration);}}@Overridepublic int getItemCount() {if (list.size() < selectMax) {return list.size() + 1;} else {return list.size();}}@Overridepublic int getItemViewType(int position) {if (isShowAddItem(position)) {return TYPE_CAMERA;} else {return TYPE_PICTURE;}}/*** 创建ViewHolder*/@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {View view = mInflater.inflate(R.layout.gv_filter_image,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;}/*** 设置值*/@Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int position) {//少于8张,显示继续添加的图标if (getItemViewType(position) == TYPE_CAMERA) {viewHolder.mImg.setImageResource(R.mipmap.upload);viewHolder.mImg.setOnClickListener(v -> {if (mOnAddPicClickListener != null) {mOnAddPicClickListener.onAddPicClick();}});viewHolder.mIvDel.setVisibility(View.INVISIBLE);} else {viewHolder.mIvDel.setVisibility(View.VISIBLE);viewHolder.mIvDel.setOnClickListener(view -> {int index = viewHolder.getAdapterPosition();// 这里有时会返回-1造成数据下标越界,具体可参考getAdapterPosition()源码,// 通过源码分析应该是bindViewHolder()暂未绘制完成导致,知道原因的也可联系我~感谢if (index != RecyclerView.NO_POSITION && list.size() > index) {list.remove(index);notifyItemRemoved(index);notifyItemRangeChanged(index, list.size());}});LocalMedia media = list.get(position);if (media == null|| TextUtils.isEmpty(media.getPath())) {return;}int chooseModel = media.getChooseModel();String path;if (media.isCut() && !media.isCompressed()) {// 裁剪过path = media.getCutPath();} else if (media.isCompressed() || (media.isCut() && media.isCompressed())) {// 压缩过,或者裁剪同时压缩过,以最终压缩过图片为准path = media.getCompressPath();} else {// 原图path = media.getPath();}Log.i(TAG, "原图地址::" + media.getPath());if (media.isCut()) {Log.i(TAG, "裁剪地址::" + media.getCutPath());}if (media.isCompressed()) {Log.i(TAG, "压缩地址::" + media.getCompressPath());Log.i(TAG, "压缩后文件大小::" + new File(media.getCompressPath()).length() / 1024 + "k");}if (!TextUtils.isEmpty(media.getAndroidQToPath())) {Log.i(TAG, "Android Q特有地址::" + media.getAndroidQToPath());}if (media.isOriginal()) {Log.i(TAG, "是否开启原图功能::" + true);Log.i(TAG, "开启原图功能后地址::" + media.getOriginalPath());}long duration = media.getDuration();viewHolder.tvDuration.setVisibility(PictureMimeType.isHasVideo(media.getMimeType())? View.VISIBLE : View.GONE);if (chooseModel == PictureMimeType.ofAudio()) {viewHolder.tvDuration.setVisibility(View.VISIBLE);viewHolder.tvDuration.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.picture_icon_audio, 0, 0, 0);} else {viewHolder.tvDuration.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.picture_icon_video, 0, 0, 0);}viewHolder.tvDuration.setText(DateUtils.formatDurationTime(duration));if (chooseModel == PictureMimeType.ofAudio()) {viewHolder.mImg.setImageResource(R.drawable.picture_audio_placeholder);} else {Glide.with(viewHolder.itemView.getContext()).load(PictureMimeType.isContent(path) && !media.isCut() && !media.isCompressed() ? Uri.parse(path): path).centerCrop().placeholder(R.color.app_color_f6).diskCacheStrategy(DiskCacheStrategy.ALL).into(viewHolder.mImg);}//itemView 的点击事件if (mItemClickListener != null) {viewHolder.itemView.setOnClickListener(v -> {int adapterPosition = viewHolder.getAdapterPosition();mItemClickListener.onItemClick(v, adapterPosition);});}if (mItemLongClickListener != null) {viewHolder.itemView.setOnLongClickListener(v -> {int adapterPosition = viewHolder.getAdapterPosition();mItemLongClickListener.onItemLongClick(viewHolder, adapterPosition, v);return true;});}}}private OnItemClickListener mItemClickListener;public void setOnItemClickListener(OnItemClickListener l) {this.mItemClickListener = l;}private OnItemLongClickListener mItemLongClickListener;public void setItemLongClickListener(OnItemLongClickListener l) {this.mItemLongClickListener = l;}/*** 点击添加图片跳转*/private onAddPicClickListener mOnAddPicClickListener;public interface onAddPicClickListener {void onAddPicClick();}public void setAddPicClickListener(onAddPicClickListener listener) {this.mOnAddPicClickListener = listener;}}

超简单PictureSelector使用,从相册中选取多张图片并显示再列表中,微信样式,解决相册全白问题,可以拖拽删除并排序相关推荐

  1. 【Flutter 问题系列第 22 篇】在 Flutter 中如何截取屏幕并显示到页面中,以及如何将截图保存到相册

    这是[Flutter 问题系列第 22 篇],如果觉得有用的话,欢迎关注专栏. 关于在 Flutter 中如何截取屏幕,以及如何将截图保存到相册的文章少之又少,即使有,也是错误一大片,有的甚至运行后都 ...

  2. jsp中如何使1和0再页面中显示为男和女

    jsp中如何使1和0再页面中显示 为男和女 具体代码如下 未转变前 转变后的代码与显示 这样很简单就完成了所需要的需求,后续如果有不懂的欢迎前来切磋

  3. linux 历史命令列表,fc – 显示历史列表中的命令或修改指定的历史命令并执行。 - Linux 命令大全...

    显示历史列表中的命令或修改指定的历史命令并执行. 概要 fc [-e ename] [-lnr] [first] [last] fc -s [pat=rep] [command] 主要用途 显示历史列 ...

  4. python获取列表中某个元素个数_如何获取列表中的元素数?

    How to get the size of a list? 要查找列表的大小,请使用内置函数len:items = [] items.append("apple") items. ...

  5. python 提取列表中长度大于3的字符串,列表中什么元素都有

    # 提取列表中长度大于3的字符串,列表中什么元素都有lt = ["asd",123,"as","ffgg"]ln = list(filter ...

  6. Python中怎么通过字典的值找到列表中对应的字典,并修改

    Python中怎么通过字典的值找到列表中对应的字典,并修改? 接下来就是我的代码 # 定义一个列表,存放字典 card_list = [{"name":"小米" ...

  7. python 列表中的数字转字符串_python 将列表中的字符串转为数字

    python 将列表中的字符串转为数字 转自:https://www.jb51.net/article/86561.htm 本文实例讲述了Python中列表元素转为数字的方法.分享给大家供大家参考,具 ...

  8. python 将列表中的字符串转为数字_python 将列表中的字符串转为数字

    本文实例讲述了python中列表元素转为数字的方法.分享给大家供大家参考,具体如下: 有一个数字字符的列表: numbers = ['1', '5', '10', '8'] 想要把每个元素转换为数字: ...

  9. discuz中写一个表单,数据存入到数据库中,再从数据库读出来显示在列表中

    2019独角兽企业重金招聘Python工程师标准>>> 要做到如下的一个效果: 创建的文件有: ./funds.php ./template/PHPChina/funds/funds ...

最新文章

  1. Java语言中的数据类型
  2. Windows上搭建Python安装包MySQLdb
  3. 手机端h5页面字体大小适配
  4. 在计算机上收回光驱快捷键,如何使用Windows键盘快捷键打开光盘驱动器
  5. [剑指offer]面试题第[38]题[JAVA][字符串的排列][回溯法]
  6. h5页面如何预览excel文件_移动端页面,如何解析预览 word/excel/PDF文件?
  7. 远程连接:hive 报错:Permission denied: user=anonymous, access=EXECUTE
  8. java验证工具类(待验证)
  9. 不了解这些“高级货”,活该你面试当炮灰。。。【石杉的架构笔记】
  10. php类型运算符,PHP-运算符类型
  11. ChartControl应用tip
  12. torch.randn用法以及小案例
  13. fasterRCNN系列
  14. SCORM学习交互开发
  15. springcloud:访问/bus/refresh地址后出现错误,,client端出现以下错误
  16. 七十八、Kettle的几个使用案例
  17. CAD错误以及解决方案
  18. AirDIsk产品第三方Samba同步工具
  19. java坦克大战总体功能设计_Java编程:坦克大战游戏的设计
  20. 认知神经科学--细胞机制与认知

热门文章

  1. 快捷餐饮之店家后台系统管理实现
  2. 【英文命名】星座、奢侈品、深海物种相关英语词汇帮助你命名
  3. 【Unity】Obi插件系列(五)—— 约束
  4. 知网 - 情感分析用词语集(beta版)- 情感词库
  5. 用ctrl+鼠标滚动调节字体大小
  6. oracle 11g duplicate database基于备份复制数据库(六)
  7. Studio用布局编辑器设计UI界面
  8. 两条线段的交点 交点
  9. Excel2JSON Excel转JSON Excel另存为JSON的技巧
  10. 你来讲讲AQS是什么吧?都是怎么用的?