• Android开发过程中的坑及解决方法收录(六)


    1. file.listFiles 空指针异常

    最近在弄个小项目,类似一个文件管理器,需要获得手机存储里的目录之后显示,但是运行过程中出现错误,搜索了资料,得出了以下的解决办法
    问题产生的原因:

    1. android6.0以上需要动态申请权限,确保自己有读取和写入SD卡的权限
    2. 以往版本的话,写入SD卡的权限其实是包含了读取SD卡的权限,但是android6.0有所改变,所以得声明读取和写入SD卡的权限,两个权限
    3. 存在有隐藏文件,在获取列表的时候出现空指针问题

    解决方法:
    针对第三个问题,我们只需要添加一个判断当前的数组是否为空即可

     java.io.File[] childFiles = file.listFiles(new FileFilter() {
                @Override
                public boolean accept(java.io.File pathname) {
                    return pathname.isDirectory() || pathname.getName().endsWith(".apk");//筛选文件夹和apk文件,统计为项目数
                }
            });
    
            if (childFiles != null) {
                if (childFiles.length == 0) {
                    count = "0项";
                } else {
                    for (int i = 0; i < childFiles.length; i++) {
                        childFilesList.add(new File(childFiles[i].getPath()));
                    }
                    count = childFiles.length+"项";
                }
            }
    

    2. fragment覆盖问题

    问题产生原因:
    Fragment默认的背景是透明的
    解决方法:
    把Fragment的背景统一设置为某个颜色即可解决

    3. RecyclerView的复用导致图标错乱

    还是之前的那个文件管理器项目遇到的问题,如果是文件夹,则显示文件夹的图标,如果是apk安装包,则显示apk图标。
    一个文件夹里面有N个文件夹,有几个是apk文件,滑到底,可以看到apk文件显示apk图标,但是,向上滑动,有几个文件夹的图标变成了apk的图标

     if (bean.isFile()) {
               //如果为文件,则设置图标为apk图标
                ImageView imageView = holder.getView(R.id.img_folder);
                imageView.setImageDrawable(getApkIcon(holder, bean.getPath()));
                imageView.setScaleType(ImageView.ScaleType.FIT_XY);
    
                holder.setViewGone(R.id.img_right);
            }
    

    原因:
    好像是因为RecyclerView有四层缓存,巴拉巴拉..
    解决方法:
    由于我们是在onBindViewHolder里面进行绘制每一个item的界面,但是,我们只有一个if语句,
    使用if判断条件,之后需要修改某个控件,我们需要补充else语句,不满足条件的则设置控件为原来的样子,也就是显示文件夹图标

    
     if (bean.isFile()) {
               //如果为文件,则设置图标为apk图标
                ImageView imageView = holder.getView(R.id.img_folder);
                imageView.setImageDrawable(getApkIcon(holder, bean.getPath()));
                imageView.setScaleType(ImageView.ScaleType.FIT_XY);
    
                holder.setViewGone(R.id.img_right);
            } else {
    			//如果不是的话,设置图标为文件夹图标
                ImageView imageView = holder.getView(R.id.img_folder);
                imageView.setImageResource(R.drawable.vector_drawable_folder);
                imageView.setScaleType(ImageView.ScaleType.FIT_XY);
    
            }
    

    4. RecyclerView中的checkbox的选择状态错乱问题

    每个item中包含着一个checkbox,之后点击了某个item的checkbox,使其变成了选择状态,和上面的例子类似,当我们往下滑动的时候,会出现几个item的checkbox也变成了选择状态的情况
    解决办法:
    在onBindViewHolder方法里面给checkbox设置一个click监听器,之后补上相关的逻辑代码,如点击之后要取消选择状态..

  • 相关阅读:
    C++:new&delete
    C++:模板——函数模板1
    C/C++:static用法总结
    C++:内存分区
    C++:友元
    C++:构造函数3——浅拷贝和深拷贝
    C++:类中两个易被忽略的默认函数
    C++:析构函数
    C++:类中的赋值函数
    SHELL基础知识
  • 原文地址:https://www.cnblogs.com/stars-one/p/10661916.html
Copyright © 2020-2023  润新知