• 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的方法,没有达到预期的效果。

      最后放上一张效果图。

         

  • 相关阅读:
    数据仓库 数据可视化 Hive导出到MySql
    数据仓库 品牌复购率
    数据仓库 转化率及漏斗分析
    数据仓库 GMV成交总额
    数据仓库 DWS层之用户行为宽表
    数据仓库 业务数仓 DWD层
    数据仓库 业务数仓 ODS层
    数据仓库 表的分类与同步策略
    数据仓库 最近七天内连续三天活跃用户数
    CF505E Mr. Kitayuta vs. Bamboos 二分+贪心
  • 原文地址:https://www.cnblogs.com/tgyf/p/4649319.html
Copyright © 2020-2023  润新知