记录某项目中的踩坑与解决(持续更新)
前言
最近参加了某个比赛, 我所选的赛题就是个类似知乎这样的安卓app,由于着手近一个月了,踩了不少坑,之前没怎么记录,估计事后也会忘记干净。
因此特开一帖,在此记录下相关的坑。
记录
Recyclerview的item显示
写完某个Recyclerview的item布局和相关适配器后, 然后展示的时候, 发现显示出来的Item数量小于List中绑定的数据量;
首先是检查了一遍适配器中的逻辑,发现没啥问题。然后在onCreateViewHolder中打log,发现只创建了两次就没了(而实际应该创建6次)。
最后百度才发现是外面的ScrollView的问题,我这里RecyclerView外套的是我自定义的ScrollView,拦截了子View的滑动事件,因此导致了测量方面的问题。
我换回原生ScrollView,内容就显示完全了。
具体参考 https://www.jianshu.com/p/5c6f9540f9f6
RecyclerView滑动冲突
ScrollView与RecyclerView产生滑动冲突时, 除了某些情况, 尽量不要使用RelaticeLayout嵌套RecyclerView来解决,因为这样的话,RelativeLayout的高度和RecyclerView显示完全的高度一样的,从而导致RecyclerView失去了某些意义, 比如说的它的回收机制,还有它的滑动监听也都无效了。因此比较主流的方式就是使用超级Adapter,即包含多类型的ViewHolder,这里可以考虑使用alibaba的vlayout
Recyclerview嵌套
今天又写了个Recyclerview嵌套多个recyclerview的布局,同样出现了显示不全的问题,然后就是盲目的去改外面那层RecyclerView的相关布局,试了许久仍无果。百度也没找到合适的答案。。最后把整个RecyclerView转移到一个全新activity中调试,发现问题依然存在,这就说明了不是外层布局嵌套存在问题了。于是乎才开始注意内层的RecyclerView,打开显示不全的那个RecyclerView布局文件, 它外面直接套了一层LinearLayout,发现其高为match_parent,才恍然大悟,将其改为wrap_content,于是乎问题便解决了。
这里得出结论:出bug时, 不要对着代码盲目修改,首先应该找到问题所在!
Android resource linking failed
在导入某个别的项目为module的时候,再引入刷新gradle,就出现了 Android resource linking failed 的错误, 也就具体点就是xml里面的某某属性找不到,以前也出现过,多数情况都是版本问题, 我把要导入的项目sdk版本升至和当前项目的相同后, 那个错误就没了。不过,又出现了另外一个错误, 百度介绍说版本问题。。但我使用的gradle最新版本,也不想为此降级,就懒得折腾这个了,索性直接把那个项目相关文件复制过来(好在项目很小)。
点赞放大动画
在实现点赞动画时, view由0.8放大至1.3倍,然而问题出现了:放大时动画被外面的view给挡住了,因此造成的用户体验很差。于是百度得到的答案是在使用动画的view的父布局的父布局加上android:clipChildren=”false” 这一条,试了之后发现并没有效果。。。 因为动画还是view的绘制与刷新,所以究其原因是还是子布局不能超出父布局,于是我给点赞图标周围留了一些空, 让其有收缩的空间,这样一来,问题就解决了。
版本大升级
由于考试等原因,项目中间停了一个月左右。回来再次使用已经打包好的项目时,竟然发现了一堆bug,中途我可啥也没修改!查看代码发现有不少未识别的类,想来想去,原因应该只有一个,就是测试机期间从安卓8.0版本升级到了9.0,因此导致出现了一系列的问题。关于那些未识别的类,我先尝试删除项目build目录,无果。然后是修改了下依赖版本,gradle刷新,问题解决。如果新版本适配有问题,可以又换回原版本,再gradle刷新可同样解决。
安卓9.0网络连接问题
安卓9.0后会对http流量进行拦截,即这种明文传输的流量。而加密过的https则可以向之前那样正常工作。解决方案可以参考这篇文章
viewHolder.itemView的点击事件无效
给viewHolder.itemView设置点击事件,无论怎样都无效。折腾一番后,发现是焦点的问题。在该item中的布局文件中,子布局设置了 android:focusable=”true” 属性,从而把焦点从根布局中抢走了,导致根布局的itemView点击事件无效。解决办法就是focusable改为false或者去掉该属性即可。