项目里,需要通过Android的webview加载一个html文件,并执行相应的js脚本。发现在部分低版本手机上,js报错的情况。主要集中在低版本的webview中。debug后发现,是js脚本中存在箭头函数(lambda表达式),导致执行失败,替换为常规函数即可。
推测是:低版本webView中,还不支持这种js语法。
#小记
我们使用RecyclerView时候,一般是setAdapter一次,之后通过调用adapter.notify()来更新数据和UI(不讨论差量更新)。
最近由于业务需求,出现一个界面中由一个RecyclerView承载所有内容,但是可以通过界面内tab_button来切换内容类别的情况,用于内容数据量较大,希望来回切换能流畅迅速。因此这里我采用了多个adapter来记录不同的类别数据,来回切换只要调用setAdapter(Adapter adapter)即可,实际也如愿完成了功能。
偶然看recyclerView源码中,有这样一个函数:
看注释基本就能够明白,这是一个和setAdapter类似的方法,不过,针对于界面view结构类似或者相同,需要频繁设置adapter的时候,做了优化,能够再切换的时候复用相同的viewHolder,减少一定的开销。
使用RecyclerView替代ListView已经是老生常谈的话题了,RecyclerView的优秀和灵活已经经过了大量项目的实践。最近在完成一个分组列表的需求时,使用到ItemDecoration,故在此对其做一番总结,加深对其的理解。
An ItemDecoration allows the application to add a special drawing and layout offset to specific item views from the adapter’s data set. This can be useful for drawing dividers between items, highlights, visual grouping boundaries and more.
ItemDecoration允许应用结合adapter的数据集,对特定的item添加绘制一个周边图案。可以用于给items之间添加分割线、高亮装饰效果或者分组边界等等。
从谷歌官方的介绍可以知道,ItemDecoration是用于给列表的item添加各种装饰效果,开发中最常见的就是为item添加分割线。
ItemDecoration本身是一个抽象类,抛去废弃的方法,我们需要关心的方法只有三个:
#View的工作原理
ViewRoot对应于ViewRootImpl,连接WindowManager和DecorView的纽带。
View的绘制流程从ViewRoot的performTraversals方法开始,经过以下三个过程:
MeasureSpec是一个会影响到View测量过程的参数。在测量View的宽高的过程中,系统会将View的LayoutParams根据父View的规则转换成对应的MeasureSpec,在进行宽高测量。
MeasureSpec是一个32位的int值,高两位代表SpecMode,低30位代表SpecSize。即模式+尺寸。Android里将这两个参数打包成了一个int值来避免过都的内存分配,可以通过get方法解包得到mode和size的分别值。源码里主要是一些“位操作”,类似:
|
|
如源码里给出的,SpecMode有三类:
大概如下图所示的一种需求:整体是一个列表,列表最末尾有一项和其他item略有区别的item。
刚开始时,由于左侧都是按照图片来加载,并没有出现任何问题。使用Fresco库加载,也不会出现列表滑动时,图片错乱的问题。
然而后续迭代时,需要将图片的背景和icon分离,方便产品配置颜色或者支持主题等。
因此这个ImageView就分为两部分处理,icon部分继续交给Fresco加载,背景部分则需要自己处理。这里是根据图片的url来判断,如果符合要求,则手动构造一个drawable并setBackground()到相关的view当中去。
然而由于listview中,itemview的视图实际上是会被复用的,因此当对其中某些view设置了background后,滑动几次,这个view将可能被复用到各个itemview上,特别的,对于尾部的item,非常容易获取到头部item的缓存视图。即便所有icon都能正常加载,但是item的背景依然会出现复用的情况。
知道问题根源,解决其他就很简单,在adapter的getView方法中,判断当前viewHolder的类型,如果是末尾这种特殊的情况,手动清理view的background即可。
PS:Android view.setBackgroundDrawable()方法已经被设为废弃,而view.setBackGround()方法最小支持sdk 16,项目最低支持sdk 15也是蛋疼。。。
/**
* 调整窗口的透明度
* @param from>=0&&from<=1.0f
* @param to>=0&&to<=1.0f
*
* */
private void dimBackground(final float from, final float to) {
final Window window = getWindow();
ValueAnimator valueAnimator = ValueAnimator.ofFloat(from, to);
valueAnimator.setDuration(500);
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
WindowManager.LayoutParams params = window.getAttributes();
params.alpha = (Float) animation.getAnimatedValue();
window.setAttributes(params);
}
});
valueAnimator.start();
}
然后这样调用:
/** 窗口背景变暗*/
dimBackground(1.0f,0.5f);
/** 窗口背景变亮*/
dimBackground(0.5f,1.0f);
实际上,这是一种隐式启动activity的方式。
为此,需要在AndroidMainfest文件中,申明隐式打开的过滤条件。
实现如下
.csv文件关联的写法比较特别,不是用缩写
是否能申明使用dialog或者fragment去处理外部传入的数据?
最近实现代码时候遇到setClickable(false)后,控件点击事件依然被执行的情况。
经查询,发现是:
SetClickable(false)方法一定要在setOnClickListener()方法之后。
因为在setOnClickListener()方法中有这样一段代码:
if (!isClickable()) {
setClickable(true);
}
所以一定要在设定监听事件之后再来set,
另外,为了避免这样问题的出现,再需要代码控制控件是否可点击的时候,
可以使用setEnable()来替代setClickable(),前者更稳定。
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true