Android开发过程中的坑及解决方法收录(六)
Android开发过程中的坑及解决方法收录(六)
- file.listFiles 空指针异常
最近在弄个小项目,类似一个文件管理器,需要获得手机存储里的目录之后显示,但是运行过程中出现错误,搜索了资料,得出了以下的解决办法
问题产生的原因:
android6.0以上需要动态申请权限,确保自己有读取和写入SD卡的权限
以往版本的话,写入SD卡的权限其实是包含了读取SD卡的权限,但是android6.0有所改变,所以得声明读取和写入SD卡的权限,两个权限
存在有隐藏文件,在获取列表的时候出现空指针问题
解决方法:
针对第三个问题,我们只需要添加一个判断当前的数组是否为空即可
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+"项"; } }
- fragment覆盖问题
问题产生原因:
Fragment默认的背景是透明的
解决方法:
把Fragment的背景统一设置为某个颜色即可解决
- 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); }
- RecyclerView中的checkbox的选择状态错乱问题
每个item中包含着一个checkbox,之后点击了某个item的checkbox,使其变成了选择状态,和上面的例子类似,当我们往下滑动的时候,会出现几个item的checkbox也变成了选择状态的情况
解决办法:
在onBindViewHolder方法里面给checkbox设置一个click监听器,之后补上相关的逻辑代码,如点击之后要取消选择状态..
原文地址https://www.cnblogs.com/kexing/p/10661916.html
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android进程间通信(一):AIDL使用详解
Android进程间通信(一):AIDL使用详解一、概述AIDL是Android Interface Definition Language的缩写,即Android接口定义语言。它是Android的进程间通信比较常用的一种方式。 Android中,每一个进程都有自己的Dalvik VM实例,拥有自己的独立的内存空间,进程与进程之间不共享内存,这就产生了进程间通信的需求。 二、语法AIDL是Android接口定义语言,是一门语言,所以它拥有自己的语法和特性。 (一)数据类型AIDL支持的数据类型包括以下几种: Java的8种基本数据类型:int,short,long,char,double,byte,float,boolean;CharSequence类型,如String、SpannableString等;ArrayListHashMap,并且K和V必须是AIDL所支持的数据类型;所有Parceable接口的实现类,因为跨进程传输对象时,本质上是序列化与反序列化的过程;AIDL接口,所有的AIDL接口本身也可以作为可支持的数据类型;有两个需要注意的地方: 1、在Java中,如果一个对象和...
- 下一篇
Android之Realm详解
Android之Realm详解文章大纲一、Realm介绍二、Realm实战三、Realm官方文档四、项目源码下载五、参考文章 一、Realm介绍 什么是Realm Realm 是一个手机数据库,是用来替代 SQlite 的解决方案,比 SQlite 更轻量级,速度更快,因为它有一套自己的数据库搜索引擎,并且还具有很多现代数据库的优点,支持 JSON,流式 API 调用,数据变更通知,自动数据同步,简单身份验证,访问控制,事件处理,最重要的是跨平台,目前已经支持 Java、Swift、Object - C、React - Native 等多种实现。 Realm优势易用 Ream 不是在SQLite基础上的ORM,它有自己的数据查询引擎。并且十分容易使用。快速 由于它是完全重新开始开发的数据库实现,所以它比任何的ORM速度都快很多,甚至比SLite速度都要快。跨平台 Realm 支持 iOS & OS X (Objective‑C & Swift) & Android。我们可以在这些平台上共享Realm数据库文件,并且上层逻辑可以不用任何改动的情况下实现移...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果