zoukankan      html  css  js  c++  java
  • Android图片浏览器之图片删除

      

      前一篇介绍了怎么从手机中读取图片文件,放入组件GridView实现网格效果缩略图显示。

      今天研究了对GridView中的子项(各张小图片)进行删除的操作,参考已有软件,长按图片跳出删除确认框。

      GridView长按事件为OnItemLongClickListener(),顺便说一下单击为OnItemClickListener()。

      直接上代码,长按缩略图中某一张小图后进行删除操作(必须带确认框):

     1 gridviewImg.setOnItemLongClickListener(new GridView.OnItemLongClickListener() {//监听事件
     2             public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
     3                 final View v = view;
     4                 final int p = position;
     5                 final Bundle savedInstanceState1 = savedInstanceState;
     6                 new AlertDialog.Builder(MainActivity.this)
     7                 .setTitle(R.string.long_click)
     8                 .setMessage(R.string.delete_firm)
     9                 .setPositiveButton(R.string.Ok,
    10                         new DialogInterface.OnClickListener() {
    11                             @Override
    12                             public void onClick(DialogInterface dialog, int which) {
    13                                 File removeFile = new File(fullPathImg.get(p));
    14                                 if (removeFile.exists()) {
    15                                     removeFile.delete();
    16                                     //refresh the gridview
    17                                     //v.setVisibility(v.GONE);
    18                                     adapterImg.notifyDataSetChanged();
    19                                     finish();
    20                                     Intent intent = new Intent(MainActivity.this, MainActivity.class);
    21                                     startActivity(intent);
    22 
    23                                     Intent media = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    24                                     Uri contentUri = Uri.fromFile(removeFile);
    25                                     media.setData(contentUri);
    26                                     MainActivity.this.sendBroadcast(media);
    27                                     //gridviewImg.postInvalidate();
    28                                     //gridviewImg.invalidate();
    29                                     //onCreate(savedInstanceState1);  //failed
    30                                 }
    31                             }
    32                         })
    33                 .setNegativeButton(R.string.Cancel,
    34                         new DialogInterface.OnClickListener() {
    35                             @Override
    36                             public void onClick(DialogInterface dialog, int which) {
    37                                 ;
    38                             }
    39                         }
    40                 ).show();
    41                 return true;
    42             }
    43         });

      虽然这段代码做的事情很简单,但有很多细节需要注意:

      1、删除GridView中的图片时,实质是将SD卡中的真实图片给删除了,因此涉及到文件的操作,定位是根据传入的position参数;

      2、确认对话框使用的是DialogInterface,在其点击响应事件中进行具体实现时不能直接使用GridView长按传入的参数,如上面的position等,

      系统提示是需要final修饰的变量才行。因此需要在开头重新定义了对应的final变量来满足要求;

    1 final View v = view;
    2 final int p = position;
    3  final Bundle savedInstanceState1 = savedInstanceState;

      3、刚开始进行实现文件删除功能时,查阅的资料均是下面几行代码:

    1 File removeFile = new File(fullPathImg.get(p));
    2  if (removeFile.exists()) {
    3     removeFile.delete();
    4 }

      其中fullPathImg再解释一下,其为存放图片完整路径的ArrayList<String>变量,调用其get()方法(以索引作为参数)即可获取图片路径。

      判断文件的存在性也非常重要,之后便是调用delete()方法进行删除,但是发现了一个问题:

      文件管理器中已经不存在删除的图片名称,但是手机自带图片浏览器中仍然可以搜索到,电脑中打开手机对应文件夹也存在该文件,只不过是已损坏文件?

      这是很不可思议的,接着又是一通查阅、提问,不得不说网上找的大部分文章都没有提及,只到delete()为止。

      后来在Android开源社区的提问得到了准确的回答,在对文件进行删除或保存后,需要对系统进行更新,是通过广播的形式来完成。

      代码也挺简洁:

    1 Intent media = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    2 Uri contentUri = Uri.fromFile(removeFile);
    3 media.setData(contentUri);
    4 MainActivity.this.sendBroadcast(media);

      就是这四行代码,完成了手机文件信息的同步。当然,也可以是两行:

    1 Intent media = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(removeFile));
    2 MainActivity.this.sendBroadcast(media);

      关于Intent和Uri的知识和用途太广了,还得慢慢学习。

      4、玩过相册的朋友应该都清楚,再删除一张图片后,软件会自动将那个空缺补上(更新GridView,当然手机自带软件不会,需要重新打开)。

      其实这里面完成了两件事情,第一,将GridView中的元素更新;第二,将显示GridView的主界面更新。

      代码如下:

    1 adapterImg.notifyDataSetChanged();
    2 finish();
    3 Intent intent = new Intent(MainActivity.this, MainActivity.class);
    4 startActivity(intent);

      finish()方法的作用是结束当前的Activity,GridView中的元素是由ImageAdapter类决定的,所以只需向后者发送数据改变的通知即可(notifyDataSetChanged())。

      代码中注释部分是开始时尝试更新GridView的方法,没有达到预期的效果。

      最后放上一张效果图。

         

  • 相关阅读:
    Visual Studio 2010使用Visual Assist X的方法
    SQL Server 2000 评估版 升级到 SQL Server 2000 零售版
    双网卡多网络单主机同时访问
    开发即过程!立此纪念一个IT新名词的诞生
    delphi dxBarManager1 目录遍历 转为RzCheckTree2树
    5320 软件集合
    delphi tree 从一个表复制到另一个表
    DELPHI 排课系统课表
    长沙金思维 出现在GOOGLE的 金思维 相关搜索里啦!!
    如何在DBGrid的每一行前加一个单选框?
  • 原文地址:https://www.cnblogs.com/tgyf/p/4649319.html
Copyright © 2011-2022 走看看