前言
之前也一直想整理一个关于相册的选择啊,图片的上传啊,展示啊,真好前段时间项目需要,于是整理了下(因为上一个项目写的比较匆忙,所以比较乱)项目刚上线就想着写个博客记录一下
先来几张效果图qaq
就是这几个界面了, 大致的思路就是获取手机的图片,选择 返回选择的路径(拍照
也差不多拿到路径就好)然后展示上传就好,下面贴一下主要代码。
开始选择的类,也就是上传的类
public class AttachFileNewActivity extends BaseHeaderActivity {
@BindView(R.id.noScrollgridview)
GridView noScrollgridview;
ArrayList<String> arrayList;
AttachFileNewAdapter fileNewAdapter;
final String mKey = "mSelectedImage";
final String mKeyReturn = "ViewBigImageActivity";
final String mKeyFileis = "AttachFileActivityIs";
final String mKeyFileNew = "AttachFileNewActivity";
String RelationRecordCode;
int isFile;
@Override
protected int getLayoutId() {
return R.layout.activity_attachfilenew;
}
@Override
protected void initView() {
mTitle.setText(R.string.NewAccessoryManagement);
mAction.setText(R.string.btn_Determine);
arrayList = new ArrayList<>();
if (getIntent().getStringExtra(mKeyFileNew) != null) {
RelationRecordCode = getIntent().getStringExtra(mKeyFileNew);
isFile = getIntent().getIntExtra(mKeyFileis, 0);
}
fileNewAdapter = new AttachFileNewAdapter(this, arrayList);
noScrollgridview.setAdapter(fileNewAdapter);
}
@Override
public void initListener() {
noScrollgridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int i, long id) {
if (i == arrayList.size()) {
ActionSheetDialog();
} else {
Bundle bundle = new Bundle();
bundle.putInt("selet", 2);// 2,大图显示当前页数,1,头像,不显示页数
bundle.putInt("code", i);//第几张
bundle.putSerializable("imageuri", arrayList);
bundle.putBoolean("isLocal", true);
Intent intent = new Intent(AttachFileNewActivity.this, ViewBigImageActivity.class);
intent.putExtras(bundle);
jumpToActivityForResult(intent, 13);
}
}
});
mAction.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (arrayList.size() != 0) initHttpPostFile();
else APP.mToast(R.string.mustOne);
}
});
}
private void initHttpPostFile() {
shouCustomProgressDialog("");
File[] mFile = new File[arrayList.size()];
String[] mS = new String[arrayList.size()];
for (int i = 0; i < arrayList.size(); i++) {
File f = new File(arrayList.get(i));
mFile[i] = f;
mS[i] = "file" + i;
}
String[] parameter = new String[1];
switch (isFile) {
case 1:
parameter = new String[]{"AccountCode", "CustomerCode"};
break;
case 2:
parameter = new String[]{"AccountCode", "RelationRecordCode"};
break;
case 3:
parameter = new String[]{"AccountCode", "ContactCode"};
break;
}
String[] content = new String[]{StringCrypto.EncodeString(APP.UserInfo.getAccountCode(), U.mKey), StringCrypto.EncodeString(RelationRecordCode, U.mKey)};
HttpPost.LoginAddFile(U.uploadPhoto(isFile), mFile, mS, parameter, content, new OnLoginListener() {
@Override
public void loginSuccess(String response, int id) {
boolean status = false;
try {
JSONObject jsonob = new JSONObject(response);
status = jsonob.optBoolean("status");
} catch (JSONException e) {
e.printStackTrace();
dissmisToast(UiUtils.getString(R.string.OkhttpDataError));
return;
}
if (status) {
dissmisToast(UiUtils.getString(R.string.uploadPhotoSuccess));
finish();
} else {
dissmisToast(UiUtils.getString(R.string.uploadPhotoError));
}
}
@Override
public void loginError(Call call, Exception e, int id) {
dissmisToast(UiUtils.getString(R.string.OkhttpError));
}
});
}
private void ActionSheetDialog() {
new ActionSheetDialog(this)
.builder()
.setCancelable(false)
.setCanceledOnTouchOutside(false)
.addSheetItem("选择相册", SheetItemColor.Blue,
new OnSheetItemClickListener() {
@Override
public void onClick(int which) {
jumpToActivityForResult(AlbumActivity.class, 13);
}
})
.addSheetItem("拍照", SheetItemColor.Blue,
new OnSheetItemClickListener() {
@Override
public void onClick(int which) {
takePhoto();
}
}).show();
}
private String path = "";
/**
* 拍照
*/
public void takePhoto() {
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File vFile = new File(Environment.getExternalStorageDirectory()
+ "/顶易手机端/附件/", String.valueOf(System
.currentTimeMillis()) + ".jpg");
if (!vFile.exists()) {
File vDirPath = vFile.getParentFile();
vDirPath.mkdirs();
} else {
if (vFile.exists()) {
vFile.delete();
}
}
path = vFile.getPath();
Uri cameraUri = Uri.fromFile(vFile);
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri);
startActivityForResult(openCameraIntent, 13);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 13 && resultCode == 33) {
List<String> array = data.getStringArrayListExtra(mKey);
if (array != null) {
arrayList.addAll(array);
fileNewAdapter.setUpdate(arrayList);
}
} else if (requestCode == 13 && resultCode == 150) {
ArrayList<String> array = data.getStringArrayListExtra(mKeyReturn);
arrayList.clear();
arrayList.addAll(array);
fileNewAdapter.setUpdate(arrayList);
} else if (requestCode == 13 && resultCode == -1 && !TextUtils.isEmpty(path)) {
arrayList.add(path);// 在添加拍照的。一共显示的是选中加拍照的
fileNewAdapter.setUpdate(arrayList);
}
}
}
由于我项目里有三个的附件管理,所以我上传的地方做了判断
下面是获取相册类,参照的是洪洋博客的
public class AlbumActivity extends BaseHeaderActivity implements ListImageDirPopupWindow.OnImageDirSelected{
private ProgressDialog mProgressDialog;
/**
* 存储文件夹中的图片数量
*/
private int mPicsSize;
/**
* 图片数量最多的文件夹
*/
private File mImgDir;
/**
* 所有的图片
*/
private List<String> mImgs;
private GridView mGirdView;
private AlbumAdapter mAdapter;
/**
* 临时的辅助类,用于防止同一个文件夹的多次扫描
*/
private HashSet<String> mDirPaths = new HashSet<String>();
/**
* 扫描拿到所有的图片文件夹
*/
private List<ImageFloder> mImageFloders = new ArrayList<ImageFloder>();
private RelativeLayout mBottomLy;
private TextView mChooseDir;
private TextView mImageCount;
int totalCount = 0;
private int mScreenHeight;
private ListImageDirPopupWindow mListImageDirPopupWindow;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
mProgressDialog.dismiss();
// 为View绑定数据
data2View();
// 初始化展示文件夹的popupWindw
initListDirPopupWindw();
}
};
@Override
protected int getLayoutId() {
return R.layout.activity_album;
}
/**
* 为View绑定数据
*/
private void data2View() {
if (mImgDir == null) {
Toast.makeText(getApplicationContext(), "擦,一张图片没扫描到",
Toast.LENGTH_SHORT).show();
return;
}
mImgs = Arrays.asList(mImgDir.list());
/**
* 可以看到文件夹的路径和图片的路径分开保存,极大的减少了内存的消耗;
*/
mAdapter = new AlbumAdapter(this, mImgs,
R.layout.grid_item, mImgDir.getAbsolutePath());
mAdapter.setAlbumAdapterRe(new AlbumAdapter.AlbumAdapterRe() {
@Override
public void ResultsetImageCount(List<String> arrayList) {
setImageCount(arrayList);
}
});
mGirdView.setAdapter(mAdapter);
mImageCount.setText(totalCount + "张");
}
/**
* 初始化展示文件夹的popupWindw
*/
private void initListDirPopupWindw() {
mListImageDirPopupWindow = new ListImageDirPopupWindow(
ViewGroup.LayoutParams.MATCH_PARENT, (int) (mScreenHeight * 0.7),
mImageFloders, LayoutInflater.from(getApplicationContext())
.inflate(R.layout.list_dir, null));
mListImageDirPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
// 设置背景颜色变暗
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = 1.0f;
getWindow().setAttributes(lp);
}
});
// 设置选择文件夹的回调
mListImageDirPopupWindow.setOnImageDirSelected(this);
}
/**
* 利用ContentProvider扫描手机中的图片,此方法在运行在子线程中 完成图片的扫描,最终获得jpg最多的那个文件夹
*/
private void getImages() {
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
Toast.makeText(this, "暂无外部存储", Toast.LENGTH_SHORT).show();
return;
}
// 显示进度条
mProgressDialog = ProgressDialog.show(this, null, "正在加载...");
new Thread(new Runnable() {
@Override
public void run() {
String firstImage = null;
Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentResolver mContentResolver = AlbumActivity.this
.getContentResolver();
// 只查询jpeg和png的图片
Cursor mCursor = mContentResolver.query(mImageUri, null,
MediaStore.Images.Media.MIME_TYPE + "=? or "
+ MediaStore.Images.Media.MIME_TYPE + "=?",
new String[]{"image/jpeg", "image/png"},
MediaStore.Images.Media.DATE_MODIFIED);
// LogUtils.e("TAG", mCursor.getCount() + "");
while (mCursor.moveToNext()) {
// 获取图片的路径
String path = mCursor.getString(mCursor
.getColumnIndex(MediaStore.Images.Media.DATA));
// LogUtils.e("TAG", path);
// 拿到第一张图片的路径
if (firstImage == null)
firstImage = path;
// 获取该图片的父路径名
File parentFile = new File(path).getParentFile();
if (parentFile == null)
continue;
String dirPath = parentFile.getAbsolutePath();
ImageFloder imageFloder = null;
// 利用一个HashSet防止多次扫描同一个文件夹(不加这个判断,图片多起来还是相当恐怖的~~)
if (mDirPaths.contains(dirPath)) {
continue;
} else {
mDirPaths.add(dirPath);
// 初始化imageFloder
imageFloder = new ImageFloder();
imageFloder.setDir(dirPath);
imageFloder.setFirstImagePath(path);
}
int picSize = parentFile.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
if (filename.endsWith(".jpg")
|| filename.endsWith(".png")
|| filename.endsWith(".jpeg"))
return true;
return false;
}
}).length;
totalCount += picSize;
imageFloder.setCount(picSize);
mImageFloders.add(imageFloder);
if (picSize > mPicsSize) {
mPicsSize = picSize;
mImgDir = parentFile;
}
}
mCursor.close();
// 扫描完成,辅助的HashSet也就可以释放内存了
mDirPaths = null;
// 通知Handler扫描图片完成
mHandler.sendEmptyMessage(0x110);
}
}).start();
}
/**
* 初始化View
*/
@Override
protected void initView() {
DisplayMetrics outMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
mScreenHeight = outMetrics.heightPixels;
mGirdView = (GridView) findViewById(R.id.id_gridView);
mChooseDir = (TextView) findViewById(R.id.id_choose_dir);
mImageCount = (TextView) findViewById(R.id.id_total_count);
mBottomLy = (RelativeLayout) findViewById(R.id.id_bottom_ly);
mTitle.setText("选择图片");
mAction.setText("确定");
getImages();
initEvent();
}
private void initEvent() {
/**
* 为底部的布局设置点击事件,弹出popupWindow
*/
mBottomLy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListImageDirPopupWindow
.setAnimationStyle(R.style.anim_popup_dir);
mListImageDirPopupWindow.showAsDropDown(mBottomLy, 0, 0);
// 设置背景颜色变暗
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = .3f;
getWindow().setAttributes(lp);
}
});
mAction.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mAdapter.setToIntent();
}
});
}
@Override
public void selected(ImageFloder floder) {
mImgDir = new File(floder.getDir());
mImgs = Arrays.asList(mImgDir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
if (filename.endsWith(".jpg") || filename.endsWith(".png")
|| filename.endsWith(".jpeg"))
return true;
return false;
}
}));
/**
* 可以看到文件夹的路径和图片的路径分开保存,极大的减少了内存的消耗;
*/
//mAdapter = new AlbumAdapter(this, mImgs,
// R.layout.grid_item, mImgDir.getAbsolutePath());
// mGirdView.setAdapter(mAdapter);
mAdapter.setAlbumAdapter(mImgs, mImgDir.getAbsolutePath());
// mAdapter.notifyDataSetChanged();
// mImageCount.setText(floder.getCount() + "张");原显示图片张数
mChooseDir.setText(floder.getName() + "/" + floder.getCount() + "张");
mListImageDirPopupWindow.dismiss();
}
public void setImageCount(List<String> mSelectedImage) {
mImageCount.setText("已选择(" + mSelectedImage.size() + ")张");
}
}
查看完整大图的类
/**
* 用于查看大图
*
* @author jingbin
*/
public class ViewBigImageActivity extends FragmentActivity implements OnPageChangeListener, PhotoViewAttacher.OnPhotoTapListener {
final String mKey = "ViewBigImageActivity";
// 保存图片
private TextView tv_save_big_image;
//删除图片 附件
private TextView tv_delete_big_image;
// 接收传过来的uri地址
List<String> imageuri;
ArrayList<AttachFileBean> imageuribean;
// 接收穿过来当前选择的图片的数量
int code;
// 用于判断是头像还是文章图片 1:头像 2:文章大图
int selet;
int isFile;//用于判断那个类型进来的
// 用于管理图片的滑动
ViewPager very_image_viewpager;
// 当前页数
private int page;
/**
* 显示当前图片的页数
*/
TextView very_image_viewpager_text;
/**
* 用于判断是否是加载本地图片
*/
private boolean isLocal;
ViewPagerAdapter adapter;
/**
* 本应用图片的id
*/
private int imageId;
/**
* 是否是本应用中的图片
*/
private boolean isApp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_big_image);
getView();
}
/**
* 保存图片至相册
*/
public static void saveImageToGallery(Context context, Bitmap bmp) {
// 首先保存图片
File appDir = new File(Environment.getExternalStorageDirectory(), "顶易手机端");
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = System.currentTimeMillis() + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
// 其次把文件插入到系统图库
try {
MediaStore.Images.Media.insertImage(context.getContentResolver(),
file.getAbsolutePath(), fileName, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 最后通知图库更新
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file.getAbsoluteFile())));
}
/**
* Glide 获得图片缓存路径
*/
private String getImagePath(String imgUrl) {
String path = null;
FutureTarget<File> future = Glide.with(ViewBigImageActivity.this)
.load(imgUrl)
.downloadOnly(500, 500);
try {
File cacheFile = future.get();
path = cacheFile.getAbsolutePath();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return path;
}
/*
* 接收控件
*/
private void getView() {
/************************* 接收控件 ***********************/
very_image_viewpager_text = (TextView) findViewById(R.id.very_image_viewpager_text);
tv_save_big_image = (TextView) findViewById(R.id.tv_save_big_image);
very_image_viewpager = (ViewPager) findViewById(R.id.very_image_viewpager);
tv_delete_big_image = (TextView) findViewById(R.id.tv_delete_big_image);
tv_save_big_image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ToastUtil.showToast("开始下载图片");
if (isApp) {// 本地图片
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), imageId);
if (bitmap != null) {
saveImageToGallery(ViewBigImageActivity.this, bitmap);
ToastUtil.showToast("保存成功");
// Toast.makeText(ViewBigImageActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
}
} else {// 网络图片
final BitmapFactory.Options bmOptions = new BitmapFactory.Options();
new Thread(new Runnable() {
@Override
public void run() {
// 子线程获得图片路径
final String imagePath = getImagePath(imageuri.get(page));
// 主线程更新
ViewBigImageActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
if (imagePath != null) {
Bitmap bitmap = BitmapFactory.decodeFile(imagePath, bmOptions);
if (bitmap != null) {
saveImageToGallery(ViewBigImageActivity.this, bitmap);
ToastUtil.showToast("已保存至" + Environment.getExternalStorageDirectory().getAbsolutePath() + "/云阅相册");
// Toast.makeText(ViewBigImageActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
}
}
}
});
}
}).start();
}
}
});
tv_delete_big_image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isLocal) {//选择相册返回的图片显示
imageuri.remove(page);
adapter.notifyDataSetChanged();
} else {//删除附件
OnHttpUtilsDelete(imageuribean.get(page).getAttachFileCode(), page);
}
}
});
/************************* 接收传值 ***********************/
Bundle bundle = getIntent().getExtras();
code = bundle.getInt("code");
selet = bundle.getInt("selet");
isLocal = bundle.getBoolean("isLocal", false);
imageuribean = (ArrayList<AttachFileBean>) bundle.getSerializable("imageuribean");
imageuri = bundle.getStringArrayList("imageuri");
isFile= bundle.getInt("isFile",0);
/**是否是本应用中的图片*/
isApp = bundle.getBoolean("isApp", false);
/**本应用图片的id*/
imageId = bundle.getInt("id", 0);
if (imageuribean != null) {
if (imageuri == null) imageuri = new ArrayList<>();
for (int i = 0; i < imageuribean.size(); i++) {
imageuri.add(imageuribean.get(i).getUrl());
}
}
/**
* 给viewpager设置适配器
*/
if (isApp) {
MyPageAdapter myPageAdapter = new MyPageAdapter();
very_image_viewpager.setAdapter(myPageAdapter);
very_image_viewpager.setEnabled(false);
} else {
adapter = new ViewPagerAdapter();
very_image_viewpager.setAdapter(adapter);
very_image_viewpager.setCurrentItem(code);
page = code;
very_image_viewpager.setOnPageChangeListener(this);
very_image_viewpager.setEnabled(false);
// 设定当前的页数和总页数
if (selet == 2) {
very_image_viewpager_text.setText((code + 1) + " / " + imageuri.size());
}
}
}
/**
* 本应用图片适配器
*/
class MyPageAdapter extends PagerAdapter {
@Override
public int getCount() {
return 1;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = getLayoutInflater().inflate(R.layout.viewpager_very_image, container, false);
PhotoView zoom_image_view = (PhotoView) view.findViewById(R.id.zoom_image_view);
ProgressBar spinner = (ProgressBar) view.findViewById(R.id.loading);
spinner.setVisibility(View.GONE);
if (imageId != 0) {
zoom_image_view.setImageResource(imageId);
}
zoom_image_view.setOnPhotoTapListener(ViewBigImageActivity.this);
container.addView(view, 0);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
View view = (View) object;
container.removeView(view);
}
}
/**
* ViewPager的适配器
*
* @author guolin
*/
class ViewPagerAdapter extends PagerAdapter {
LayoutInflater inflater;
ViewPagerAdapter() {
inflater = getLayoutInflater();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = inflater.inflate(R.layout.viewpager_very_image, container, false);
final PhotoView zoom_image_view = (PhotoView) view.findViewById(R.id.zoom_image_view);
final ProgressBar spinner = (ProgressBar) view.findViewById(R.id.loading);
// 保存网络图片的路径
String adapter_image_Entity = (String) getItem(position);
//TODO
String imageUrl;
if (isLocal) {
imageUrl = "file://" + adapter_image_Entity;
tv_save_big_image.setVisibility(View.GONE);
} else {
imageUrl = adapter_image_Entity;
}
spinner.setVisibility(View.VISIBLE);
spinner.setClickable(false);
Glide.with(ViewBigImageActivity.this).load(imageUrl)
.crossFade(700)
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
Toast.makeText(getApplicationContext(), "资源加载异常", Toast.LENGTH_SHORT).show();
spinner.setVisibility(View.GONE);
return false;
}
//这个用于监听图片是否加载完成
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
// Toast.makeText(getApplicationContext(), "图片加载完成", Toast.LENGTH_SHORT).show();
spinner.setVisibility(View.GONE);
/**这里应该是加载成功后图片的高*/
int height = zoom_image_view.getHeight();
int wHeight = getWindowManager().getDefaultDisplay().getHeight();
if (height > wHeight) {
zoom_image_view.setScaleType(ImageView.ScaleType.CENTER_CROP);
} else {
zoom_image_view.setScaleType(ImageView.ScaleType.FIT_CENTER);
}
return false;
}
}).into(zoom_image_view);
zoom_image_view.setOnPhotoTapListener(ViewBigImageActivity.this);
container.addView(view, 0);
return view;
}
@Override
public int getCount() {
if (imageuri == null || imageuri.size() == 0) {
return 0;
}
return imageuri.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
View view = (View) object;
container.removeView(view);
}
Object getItem(int position) {
return imageuri.get(position);
}
}
/**
* 下面是对Viewpager的监听
*/
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
/**
* 本方法主要监听viewpager滑动的时候的操作
*/
@Override
public void onPageSelected(int arg0) {
// 每当页数发生改变时重新设定一遍当前的页数和总页数
very_image_viewpager_text.setText((arg0 + 1) + " / " + imageuri.size());
page = arg0;
}
@Override
public void onPhotoTap(View view, float x, float y) {
finish();
}
@Override
public void onOutsidePhotoTap() {
// finish();
}
private void OnHttpUtilsDelete(String json, final int i) {
ToastUtil.showToast("开始删除图片");
HttpPost.LoginUrl(this, U.deleteRelationAttachFile(json,isFile), new OnLoginListener() {
@Override
public void loginSuccess(String response, int id) {
boolean status = false;
try {
JSONObject jsonob = new JSONObject(response);
status = jsonob.optBoolean("status");
} catch (JSONException e) {
e.printStackTrace();
ToastUtil.showToast(UiUtils.getString(R.string.OkhttpDelete));
return;
}
if (status) {
imageuri.remove(i);
adapter.notifyDataSetChanged();
ToastUtil.showToast(UiUtils.getString(R.string.OkhttpDelete));
} else {
ToastUtil.showToast(UiUtils.getString(R.string.OkhttpDeleteError));
}
}
@Override
public void loginError(Call call, Exception e, int id) {
ToastUtil.showToast(UiUtils.getString(R.string.OkhttpError));
}
});
}
// 返回键返回事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (KeyEvent.KEYCODE_BACK == keyCode) {
//根据 Tag 取消请求
OkHttpUtils.getInstance().cancelTag(this);
overridePendingTransition(R.anim.move_left_in_activity, R.anim.move_right_out_activity);
Intent intent = new Intent();
intent.putStringArrayListExtra(mKey, (ArrayList<String>) imageuri);
//记录下要返回给那个父亲,可能还有什么继父什么的
setResult(150, intent);
finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
也是复用了多次了的,所以判断比较多,用到的第三方有 okhttputlis,Glide,uk.co.senab.photoview.
下面是图片展示的类
public class AttachFileActivity extends BaseHeaderActivity implements BGARefreshLayout.BGARefreshLayoutDelegate {
@BindView(R.id.id_gridView)
GridView idGridView;
AttachFileAdapter fileAdapter;
@BindView(R.id.mRefreshLayout)
BGARefreshLayout mRefreshLayout;
@BindView(R.id.tv_context)
TextView tvContext;
@BindView(R.id.ll_error_refresh)
LinearLayout llErrorRefresh;
ArrayList<AttachFileBean> mRatingArray;
final String mKey = "AttachFileActivity";
final String mKeyFileis = "AttachFileActivityIs";
final String mKeyFileNew = "AttachFileNewActivity";
String RelationRecordCode;
int isFile;
@Override
protected int getLayoutId() {
return R.layout.activity_attachfile;
}
@Override
protected void initView() {
mTitle.setText(R.string.AccessoryManagement);
mAction.setText(R.string.NewlyAdded);
if (getIntent().getStringExtra(mKey) != null) {
RelationRecordCode = getIntent().getStringExtra(mKey);
isFile=getIntent().getIntExtra(mKeyFileis,0);
}
mRatingArray = new ArrayList<>();
fileAdapter = new AttachFileAdapter(this, mRatingArray, R.layout.item_attachfile);
idGridView.setAdapter(fileAdapter);
initHttpPost();
}
@Override
public void initListener() {
mRefreshLayout.setDelegate(this);
BGAStickinessRefreshViewHolder stickinessRefreshViewHolder = new BGAStickinessRefreshViewHolder(this, false);
stickinessRefreshViewHolder.setStickinessColor(R.color.colorAccent);
stickinessRefreshViewHolder.setRotateImage(R.mipmap.bga_refresh_stickiness);
mRefreshLayout.setRefreshViewHolder(stickinessRefreshViewHolder);
idGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Bundle bundle = new Bundle();
bundle.putInt("selet", 2);// 2,大图显示当前页数,1,头像,不显示页数
bundle.putInt("code", position);//第几张
bundle.putSerializable("imageuribean", mRatingArray);
bundle.putInt("isFile", isFile);//那个类型附件进来的
Intent intent = new Intent(AttachFileActivity.this, ViewBigImageActivity.class);
intent.putExtras(bundle);
startActivity(intent);
}
});
mAction.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(AttachFileActivity.this, AttachFileNewActivity.class);
intent.putExtra(mKeyFileNew, RelationRecordCode);
intent.putExtra(mKeyFileis, isFile);
jumpToActivity(intent);
}
});
}
private void initHttpPost() {
if (mRatingArray == null)
initLoading(tvContext, llErrorRefresh);
shouCustomProgressDialog("");
HttpPost.LoginUrlACache(TAG, U.getAllAttachFile(RelationRecordCode,isFile), new OnLoginListener() {
@Override
public void loginSuccess(String response, int id) {
boolean status = false;
String list = null;
try {
JSONObject jsonObject = new JSONObject(response);
status = jsonObject.optBoolean("status");
list = jsonObject.optString("list");
} catch (JSONException e) {
e.printStackTrace();
dissmisToast(UiUtils.getString(R.string.OkhttpDataError));
initError(tvContext, llErrorRefresh, new OnLoading() {
@Override
public void Refresh(View v) {
initHttpPost();
}
});
return;
}
if (status) {
mRatingArray = APP.gson.fromJson(list,
new TypeToken<List<AttachFileBean>>() {
}.getType());
if (isSize(mRatingArray)) {
initTo();
initSuccess(llErrorRefresh);
dissmisCustomProgressDialog();
} else {
initRefresh(tvContext, R.string.http_no, llErrorRefresh);
dissmisToast(UiUtils.getString(R.string.http_no));
}
} else {
dissmisToast(UiUtils.getString(R.string.OkhttpDataError));
initError(tvContext, llErrorRefresh, new OnLoading() {
@Override
public void Refresh(View v) {
initHttpPost();
}
});
}
mRefreshLayout.endRefreshing();
}
@Override
public void loginError(Call call, Exception e, int id) {
dissmisToast(UiUtils.getString(R.string.OkhttpError));
initError(tvContext, llErrorRefresh, new OnLoading() {
@Override
public void Refresh(View v) {
initHttpPost();
}
});
mRefreshLayout.endRefreshing();
}
});
}
private void initTo() {
fileAdapter.setData(mRatingArray);
}
@Override
public void onBGARefreshLayoutBeginRefreshing(BGARefreshLayout refreshLayout) {
HttpPost.isLogin = true;
initHttpPost();
}
@Override
public boolean onBGARefreshLayoutBeginLoadingMore(BGARefreshLayout refreshLayout) {
return false;
}
}
下面附上一些适配器什么的用到的类以及用到的一些方法
展示图片的继承的通用适配器,百度一下就有的
public class AttachFileAdapter extends CommonAdapter<AttachFileBean> {
/**
* 构造函数
*
* @param context 上下文
* @param data 显示的数据
* @param layout_id listview使用的条目的布局文件id
*/
public AttachFileAdapter(Context context, List<AttachFileBean> data, int layout_id) {
super(context, data, layout_id);
}
public void setData(List<AttachFileBean> data) {
this.data = data;
notifyDataSetChanged();
}
@Override
public void convert(ViewHolder h, AttachFileBean item, int i) {
String prefix=item.getUrl().substring(item.getUrl().lastIndexOf(".")+1);
if (prefix.equals("png")||prefix.equals("jpg")){
h.setImageByUrl(R.id.iv_welfare, item.getUrl(), false);
}else {
h.setImageByUrl(R.id.iv_welfare,R.mipmap.img_default_meizi, false);
}
if (i % 2 == 0) {
DensityUtil.setViewMargin((View) h.getViewById(R.id.iv_welfare),false, 12, 6, 12, 0);
} else {
DensityUtil.setViewMargin((View) h.getViewById(R.id.iv_welfare), false, 6, 12, 12, 0);
}
}
}
/**
* 设置某个View的margin
*
* @param view 需要设置的view
* @param isDp 需要设置的数值是否为DP
* @param left 左边距
* @param right 右边距
* @param top 上边距
* @param bottom 下边距
* @return
*/
public static ViewGroup.LayoutParams setViewMargin(View view, boolean isDp, int left, int right, int top, int bottom) {
if (view == null) {
return null;
}
int leftPx = left;
int rightPx = right;
int topPx = top;
int bottomPx = bottom;
ViewGroup.LayoutParams params = view.getLayoutParams();
ViewGroup.MarginLayoutParams marginParams = null;
//获取view的margin设置参数
if (params instanceof ViewGroup.MarginLayoutParams) {
marginParams = (ViewGroup.MarginLayoutParams) params;
} else {
//不存在时创建一个新的参数
marginParams = new ViewGroup.MarginLayoutParams(params);
}
//根据DP与PX转换计算值
if (isDp) {
leftPx = dip2px(left);
rightPx = dip2px(right);
topPx = dip2px(top);
bottomPx = dip2px(bottom);
}
//设置margin
marginParams.setMargins(leftPx, topPx, rightPx, bottomPx);
view.setLayoutParams(marginParams);
view.requestLayout();
return marginParams;
}
上面用的一些方法
/**
* 为ImageView设置图片
*
* @param viewId
* @param url
* @param is 是否开启内存缓存
* @return
*/
public void setImageByUrl(int viewId, String url,boolean is)
{
Glide.with(context)
.load(url)
.placeholder(Drawables.sPlaceholderDrawable)//设置资源加载过程中的占位Drawable。
.error(Drawables.sErrorDrawable)//设置load失败时显示的Drawable。
//.centerCrop()
.skipMemoryCache(is) //使用内存缓存
.diskCacheStrategy(DiskCacheStrategy.NONE) //不使用硬盘缓存
.into((ImageView) getViewById(viewId));
}
/**
* 根据控件id获取控件对象
*
* @param viewId
* @return
*/
@SuppressWarnings("unchecked")
public <T> T getViewById(int viewId) {
// 从集合中根据这个id获取view视图对象
View view = mViews.get(viewId);
// 如果为空,说明是第一次获取,里面没有,那就在布局文件中找到这个控件,并且存进集合中
if (view == null) {
view = mContentView.findViewById(viewId);
mViews.put(viewId, view);
}
// 返回控件对象
return (T) view;
}
上传的类的适配器,也是复用多次的
public class AttachFileNewAdapter extends BaseAdapter {
private LayoutInflater inflater;
ArrayList<String> list;
Context context;
public AttachFileNewAdapter(Context context, ArrayList<String> list) {
inflater = LayoutInflater.from(context);
this.context = context;
this.list = list;
}
public void setUpdate(ArrayList<String> list) {
this.list = list;
notifyDataSetChanged();
}
@Override
public int getCount() {
if (list.size() == 0) {
return 1;
} else {
return list.size() + 1;// 加一个选择图片
}
}
@Override
public Object getItem(int i) {
if (list.size() == 0 || i - 1 < 0
|| i > list.size() ) {
return null;
} else {
return list.get(i-1);
}
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_attachfilenew,
parent, false);
holder = new ViewHolder();
holder.image = (ImageView) convertView
.findViewById(R.id.item_grida_image);
if (i % 3 == 0) {
DensityUtil.setViewMargin(holder.image,false, 12, 6, 12, 0);
} else {
DensityUtil.setViewMargin(holder.image, false, 6, 12, 12, 0);
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if(i == parent.getChildCount()){
LogUtils.e("list.size()=",list.size()+"/position="+i);
if (isShowAddItem(i)) {//若为真,则表示没有图片,显示添加图片的标志
holder.image.setImageBitmap(BitmapFactory.decodeResource(
context.getResources(), R.mipmap.additem));
}else {
setImageByUrl(holder.image,list.get(i),false);
}
//正常调用
}else{
//系统为计算item高度额外调用
}
return convertView;
}
public class ViewHolder {
public ImageView image;
}
public void setImageByUrl(View v, String url,boolean is)
{
Glide.with(context)
.load(url)
.placeholder(Drawables.sPlaceholderDrawable)//设置资源加载过程中的占位Drawable。
.error(Drawables.sErrorDrawable)//设置load失败时显示的Drawable。
.centerCrop()
.override(APP.windowWidth/3, UiUtils.getDimension(R.dimen.x120))
.skipMemoryCache(is) //使用内存缓存
.diskCacheStrategy(DiskCacheStrategy.NONE) //不使用硬盘缓存
.into((ImageView)v);
}
private boolean isShowAddItem(int position) {
// mDataList == null则size=0,mDataList != null则size=mDataList.size();
int size = list == null ? 0 : list.size();
return position == size;
}
}
相册选择的适配器
public class AlbumAdapter extends CommonAdapter<String> {
/**
* 用户选择的图片,存储为图片的完整路径
*/
public List<String> mSelectedImage = new LinkedList<String>();
AlbumAdapterRe albumAdapterRe;
/**
* 文件夹路径
*/
private String mDirPath;
public AlbumAdapter(Context context, List<String> mDatas, int itemLayoutId,
String dirPath) {
super(context, mDatas, itemLayoutId);
this.mDirPath = dirPath;
}
public void setAlbumAdapterRe(AlbumAdapterRe albumAdapterRe) {
this.albumAdapterRe = albumAdapterRe;
}
public void setAlbumAdapter(List<String> mDatas, String dirPath) {
this.data = mDatas;
this.mDirPath = dirPath;
notifyDataSetChanged();
}
@Override
public void convert(final ViewHolder helper, final String item, int position) {
//设置no_pic
// helper.setImageResource(R.id.id_item_image, R.mipmap.pictures_no);
//设置no_selected
helper.setImageResource(R.id.id_item_select,
R.mipmap.picture_unselected);
//设置图片
helper.setImageByUrl(R.id.id_item_image, mDirPath + "/" + item, false);
final ImageView mImageView = helper.getViewById(R.id.id_item_image);
final ImageView mSelect = helper.getViewById(R.id.id_item_select);
mImageView.setColorFilter(null);
//设置ImageView的点击事件
mImageView.setOnClickListener(new View.OnClickListener() {
//选择,则将图片变暗,反之则反之
@Override
public void onClick(View v) { // 已经选择过该图片
if (mSelectedImage.contains(mDirPath + "/" + item)) {
mSelectedImage.remove(mDirPath + "/" + item);
mSelect.setImageResource(R.mipmap.picture_unselected);
mImageView.setColorFilter(null);
} else {// 未选择该图片
mSelectedImage.add(mDirPath + "/" + item);
mSelect.setImageResource(R.mipmap.pictures_selected);
mImageView.setColorFilter(Color.parseColor("#77000000"));
}
helper.setImageByUrl(R.id.id_item_image, mDirPath + "/" + item, false);
if(albumAdapterRe!=null)
albumAdapterRe.ResultsetImageCount(mSelectedImage);
}
});
/**
* 已经选择过的图片,显示出选择过的效果
*/
if (mSelectedImage.contains(mDirPath + "/" + item)) {
mSelect.setImageResource(R.mipmap.pictures_selected);
mImageView.setColorFilter(Color.parseColor("#77000000"));
}
}
public void setToIntent() {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.addAll(mSelectedImage);
Intent intent = new Intent(context, AttachFileNewActivity.class);
intent = intent.putStringArrayListExtra("mSelectedImage", arrayList);
((AlbumActivity)context).setResult(33, intent);
((AlbumActivity)context).finish();
}
public interface AlbumAdapterRe {
void ResultsetImageCount(List<String> arrayList);
}
}
储存图片的bean
public class ImageFloder
{
/**
* 图片的文件夹路径
*/
private String dir;
/**
* 第一张图片的路径
*/
private String firstImagePath;
/**
* 文件夹的名称
*/
private String name;
/**
* 图片的数量
*/
private int count;
public String getDir()
{
return dir;
}
public void setDir(String dir)
{
this.dir = dir;
int lastIndexOf = this.dir.lastIndexOf("/");
this.name = this.dir.substring(lastIndexOf);
}
public String getFirstImagePath()
{
return firstImagePath;
}
public void setFirstImagePath(String firstImagePath)
{
this.firstImagePath = firstImagePath;
}
public String getName()
{
return name;
}
public int getCount()
{
return count;
}
public void setCount(int count)
{
this.count = count;
}
}
弹窗的类
public class ListImageDirPopupWindow extends BasePopupWindowForListView<ImageFloder>
{
private ListView mListDir;
public ListImageDirPopupWindow(int width, int height,
List<ImageFloder> datas, View convertView)
{
super(convertView, width, height, true, datas);
}
@Override
public void initViews()
{
mListDir = (ListView) findViewById(R.id.id_list_dir);
mListDir.setAdapter(new CommonAdapter<ImageFloder>(context, mDatas,
R.layout.list_dir_item)
{
@Override
public void convert(ViewHolder helper, ImageFloder item, int i)
{
helper.setText(R.id.id_dir_item_name, item.getName());
helper.setImageByUrl(R.id.id_dir_item_image,
item.getFirstImagePath(),false);
helper.setText(R.id.id_dir_item_count, item.getCount() + "张");
}
});
}
public interface OnImageDirSelected
{
void selected(ImageFloder floder);
}
private OnImageDirSelected mImageDirSelected;
public void setOnImageDirSelected(OnImageDirSelected mImageDirSelected)
{
this.mImageDirSelected = mImageDirSelected;
}
@Override
public void initEvents()
{
mListDir.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
{
if (mImageDirSelected != null)
{
mImageDirSelected.selected(mDatas.get(position));
}
}
});
}
@Override
public void init()
{
}
@Override
protected void beforeInitWeNeedSomeParams(Object... params)
{
}
}
public abstract class BasePopupWindowForListView<T> extends PopupWindow
{
/**
* 布局文件的最外层View
*/
protected View mContentView;
protected Context context;
/**
* ListView的数据集
*/
protected List<T> mDatas;
public BasePopupWindowForListView(View contentView, int width, int height,
boolean focusable)
{
this(contentView, width, height, focusable, null);
}
public BasePopupWindowForListView(View contentView, int width, int height,
boolean focusable, List<T> mDatas)
{
this(contentView, width, height, focusable, mDatas, new Object[0]);
}
public BasePopupWindowForListView(View contentView, int width, int height,
boolean focusable, List<T> mDatas, Object... params)
{
super(contentView, width, height, focusable);
this.mContentView = contentView;
context = contentView.getContext();
if (mDatas != null)
this.mDatas = mDatas;
if (params != null && params.length > 0)
{
beforeInitWeNeedSomeParams(params);
}
setBackgroundDrawable(new BitmapDrawable());
setTouchable(true);
setOutsideTouchable(true);
setTouchInterceptor(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
if (event.getAction() == MotionEvent.ACTION_OUTSIDE)
{
dismiss();
return true;
}
return false;
}
});
initViews();
initEvents();
init();
}
protected abstract void beforeInitWeNeedSomeParams(Object... params);
public abstract void initViews();
public abstract void initEvents();
public abstract void init();
public View findViewById(int id)
{
return mContentView.findViewById(id);
}
protected static int dpToPx(Context context, int dp)
{
return (int) (context.getResources().getDisplayMetrics().density * dp + 0.5f);
}
}
上传文件引用的okhttphutlis
/**
* 上传文件的
*
* @param url
* @param file 文件
* @param image 文件名,后台的字段
* @param Login
*/
public static void LoginAddFile(String url, File[] file, String[] image, String[] parameter, String[] content, final OnLoginListener Login) {
PostFormBuilder postFormBuilder = OkHttpUtils.post().url(url);
for (int i = 0; i < file.length; i++) {
postFormBuilder.addFile(image[i], file[i].getName(), file[i]);
}
for (int i = 0; i < parameter.length; i++) {
postFormBuilder.addParams(parameter[i], content[i]);
}
postFormBuilder.build().execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
if (Login != null)
Login.loginError(call, e, id);
}
@Override
public void onResponse(String response, int id) {
if (Login != null)
Login.loginSuccess(response, id);
}
});
}