Android图片浏览器之图片删除
2015-07-15 19:34
666 查看
前一篇介绍了怎么从手机中读取图片文件,放入组件GridView实现网格效果的缩略图显示。
今天研究了对GridView中的子项(各张小图片)进行删除的操作,参考已有软件,长按图片跳出删除确认框。
GridView长按事件为OnItemLongClickListener(),顺便说一下单击为OnItemClickListener()。
直接上代码,长按缩略图中某一张小图后进行删除操作(必须带确认框):
gridviewImg.setOnItemLongClickListener(new GridView.OnItemLongClickListener() {//监听事件 public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { final View v = view; final int p = position; final Bundle savedInstanceState1 = savedInstanceState; new AlertDialog.Builder(MainActivity.this) .setTitle(R.string.long_click) .setMessage(R.string.delete_firm) .setPositiveButton(R.string.Ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { File removeFile = new File(fullPathImg.get(p)); if (removeFile.exists()) { removeFile.delete(); //refresh the gridview //v.setVisibility(v.GONE); adapterImg.notifyDataSetChanged(); finish(); Intent intent = new Intent(MainActivity.this, MainActivity.class); startActivity(intent); Intent media = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri contentUri = Uri.fromFile(removeFile); media.setData(contentUri); MainActivity.this.sendBroadcast(media); //gridviewImg.postInvalidate(); //gridviewImg.invalidate(); //onCreate(savedInstanceState1); //failed } } }) .setNegativeButton(R.string.Cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ; } } ).show(); return true; } });
虽然这段代码做的事情很简单,但有很多细节需要注意:
1、删除GridView中的图片时,实质是将SD卡中的真实图片给删除了,因此涉及到文件的操作,定位是根据传入的position参数;
2、确认对话框使用的是DialogInterface,在其点击响应事件中进行具体实现时不能直接使用GridView长按传入的参数,如上面的position等,
系统提示是需要final修饰的变量才行。因此需要在开头重新定义了对应的final变量来满足要求;
final View v = view; final int p = position; final Bundle savedInstanceState1 = savedInstanceState;
3、刚开始进行实现文件删除功能时,查阅的资料均是下面几行代码:
File removeFile = new File(fullPathImg.get(p)); if (removeFile.exists()) { removeFile.delete(); }
其中fullPathImg再解释一下,其为存放图片完整路径的ArrayList<String>变量,调用其get()方法(以索引作为参数)即可获取图片路径。
判断文件的存在性也非常重要,之后便是调用delete()方法进行删除,但是发现了一个问题:
文件管理器中已经不存在删除的图片名称,但是手机自带图片浏览器中仍然可以搜索到,电脑中打开手机对应文件夹也存在该文件,只不过是已损坏文件?
这是很不可思议的,接着又是一通查阅、提问,不得不说网上找的大部分文章都没有提及,只到delete()为止。
后来在Android开源社区的提问得到了准确的回答,在对文件进行删除或保存后,需要对系统进行更新,是通过广播的形式来完成。
代码也挺简洁:
Intent media = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri contentUri = Uri.fromFile(removeFile); media.setData(contentUri); MainActivity.this.sendBroadcast(media);
就是这四行代码,完成了手机文件信息的同步。当然,也可以是两行:
Intent media = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(removeFile)); MainActivity.this.sendBroadcast(media);
关于Intent和Uri的知识和用途太广了,还得慢慢学习。
4、玩过相册的朋友应该都清楚,再删除一张图片后,软件会自动将那个空缺补上(更新GridView,当然手机自带软件不会,需要重新打开)。
其实这里面完成了两件事情,第一,将GridView中的元素更新;第二,将显示GridView的主界面更新。
代码如下:
adapterImg.notifyDataSetChanged(); finish(); Intent intent = new Intent(MainActivity.this, MainActivity.class); startActivity(intent);
finish()方法的作用是结束当前的Activity,GridView中的元素是由ImageAdapter类决定的,所以只需向后者发送数据改变的通知即可(notifyDataSetChanged())。
代码中注释部分是开始时尝试更新GridView的方法,没有达到预期的效果。
最后放上一张效果图。
相关文章推荐
- android菜鸟学习笔记26----Android广播消息及BroadcastReceiver
- android 视图getParent,getChildAt
- android studio 更新 Gradle错误解决方法
- ArrayAdapter中的android.R.id.text1是什么
- 辗转到了Android
- Android Intents with Chrome
- Android 录音
- Android 你应该知道的学习资源 进阶之路贵在坚持
- android MediaRecorder 与 AudioRecord 差异
- Android在ListView滑动数据混乱
- Android - Launcher Icon Size
- Android系统匿名共享内存Ashmem
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
- Android系统的定制
- Android ImageView.ScaleType说明
- Android:Layout_weight的深刻理解
- 如何提高Android应用启动速度,避免启动时黑屏太久
- Android 文字竖排效果
- Android ExpandableListView的使用
- 大约Android远程监控APP源代码