RecyclerView与AppBarLayout 组合的下拉刷新、滑动不顺畅的问题

滑动有粘性 滑动有粘性,需要在拉一次才能生效,解决办法: mRecylerview.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE) { int firstVisiblePosition = layoutManager.findFirstCompletelyVisibleItemPosition(); if (firstVisiblePosition == 0) { mAppbar.setExpanded(true, true); } } } }); 下拉刷新 如果appBarLayout中有折叠控件 CollapsingToolbarLayout 或者其他一些控件 在滚动的时候进行判断和刷新事件处理: 第一步:设置appBarLayout的监听: if (appBarLayout != null) appBarLayout.addOnOffsetChangedListener(this); 第二部: @Override public void onOffsetChanged(AppBarLayout appBarLayout, int i) { super.onOffsetChanged(appBarLayout, i); if (srlLayout == null) return; srlLayout....

七月 8, 2018 · 1 分钟 · LengYue

利用Android源码,轻松实现汉字转拼音功能

今天和大家分享一个从Android系统源代码提取出来的汉字转成拼音实现方案,只要一个类,560多行代码就可以让你轻松实现汉字转成拼音的功能,且无需其他任何第三方依赖。 ...

七月 8, 2018 · 1 分钟 · LengYue

完全使用kotlin实现的StateLayout类库

Gihub地址:https://github.com/huclengyue/StateLayoutWithKotlin 这个项目是根据 StateLayout 项目而来,感谢原作者的贡献,我本人在功能实现上只做了稍许改动,主要的不同在于这个是完全使用Kotlin编写的,可以看做是一个kotlin练手项目。 由于我也是刚刚使用Kotlin,使用还不是很熟练,如果在写法、功能实现上有不够优雅的地方欢迎指正! 更新 优化了各个View的加载逻辑,在调用相应布局时才会加载,节约资源。 删除了部分无用的方法 下面是原项目的readme部分 演示 StateLayout用法 引入布局 用法与ScrollView一致,只允许一个根布局 <com.fingdo.statelayout.StateLayout android:id="@+id/state_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 内容布局 one root view --> </com.fingdo.statelayout.StateLayout> 布局设置图标和文字 <declare-styleable name="StateLayout"> <!-- 错误提示图标 --> <attr name="errorImg" format="reference" /> <!-- 错误提示文字 --> <attr name="errorText" format="string" /> <!-- 空数据提示图标 --> <attr name="emptyImg" format="reference" /> <!-- 空数据提示文字 --> <attr name="emptyText" format="string" /> <!...

七月 8, 2018 · 2 分钟 · LengYue

解决Android拍照保存在系统相册不显示的问题

可能大家都知道我们保存相册到Android手机的时候,然后去打开系统图库找不到我们想要的那张图片,那是因为我们插入的图片还没有更新的缘故,先讲解下插入系统图库的方法吧,很简单,一句代码就能实现 MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "", ""); 通过上面的那句代码就能插入到系统图库,这时候有一个问题,就是我们不能指定插入照片的名字,而是系统给了我们一个当前时间的毫秒数为名字,有一个问题郁闷了很久,我还是先把insertImage的源码贴出来吧 /** * Insert an image and create a thumbnail for it. * * @param cr The content resolver to use * @param source The stream to use for the image * @param title The name of the image * @param description The description of the image * @return The URL to the newly created image, or <code>null</code> if the image failed to be stored * for any reason....

七月 8, 2018 · 3 分钟 · LengYue

Android 6.0需要申请的权限分类

6.0之前开发者申请各种权限,只需要在清单列表(AndroidManifest.xml)中进行声明就可以了。对开发者来说是相当便利,但对用户来说是体验不好,6.0的权限换成了用户可以随时更改的操作,类似IOS的权限申请。 常规的权限 和以前一样,在清单中申请,这里不作累述 ####需要申请的权限 google是以权限组进行分类的,一旦组内的某个权限被赋予了,那么这个组的其他权限也将自动被赋予 !!! 权限组 权限 android.permission-group.CALENDAR(日历数据) android.permission.READ_CALENDARandroid.permission.WRITE_CALENDAR android.permission-group.CAMERA(相机) android.permission.CAMERA android.permission-group.CONTACTS(联系人) android.permission.READ_CONTACTSandroid.permission.WRITE_CONTACTSandroid.permission.GET_ACCOUNTS android.permission-group.LOCATION(位置) android.permission.ACCESS_FINE_LOCATIONandroid.permission.ACCESS_COARSE_LOCATION android.permission-group.MICROPHONE(麦克风) android.permission.RECORD_AUDIO android.permission-group.PHONE(电话) android.permission.READ_PHONE_STATEandroid.permission.CALL_PHONEandroid.permission.READ_CALL_LOGandroid.permission.WRITE_CALL_LOGcom.android.voicemail.permission.ADD_VOICEMAILandroid.permission.USE_SIPandroid.permission.PROCESS_OUTGOING_CALLS android.permission-group.SENSORS(传感器) android.permission.BODY_SENSORS android....

七月 6, 2018 · 1 分钟 · LengYue

Android ListView 与 RecyclerView 对比浅析—缓存机制

一,背景 RecyclerView是谷歌官方出的一个用于大量数据展示的新控件,可以用来代替传统的ListView,更加强大和灵活。 最近,自己负责的业务,也遇到这样的一个问题,关于是否要将ListView替换为RecyclerView? 秉承着实事求是的作风,弄清楚RecyclerView是否有足够的吸引力替换掉ListView,我从性能这一角度出发,研究RecyclerView和ListView二者的缓存机制,并得到了一些较有益的”结论”,待我慢慢道来。 同时也希望能通过本文,让大家快速了解RecyclerView与ListView在缓存机制上的一些区别,在使用上也更加得心应手吧。 PS:相关知识: ListView与RecyclerView缓存机制原理大致相似,如下图所示: 过程中,离屏的ItemView即被回收至缓存,入屏的ItemView则会优先从缓存中获取,只是ListView与RecyclerView的实现细节有差异.(这只是缓存使用的其中一个场景,还有如刷新等) PPS:本文不贴出详细代码,结合源码食用更佳! 二. 正文 2.1 缓存机制对比 层级不同: RecyclerView比ListView多两级缓存,支持多个离ItemView缓存,支持开发者自定义缓存处理逻辑,支持所有RecyclerView共用同一个RecyclerViewPool(缓存池)。 具体来说: ListView(两级缓存): RecyclerView(四级缓存): ListView和RecyclerView缓存机制基本一致: 1). mActiveViews和mAttachedScrap功能相似,意义在于快速重用屏幕上可见的列表项ItemView,而不需要重新createView和bindView; 2). mScrapView和mCachedViews + mReyclerViewPool功能相似,意义在于缓存离开屏幕的ItemView,目的是让即将进入屏幕的ItemView重用. 3). RecyclerView的优势在于a.mCacheViews的使用,可以做到屏幕外的列表项ItemView进入屏幕内时也无须bindView快速重用;b.mRecyclerPool可以供多个RecyclerView共同使用,在特定场景下,如viewpaper+多个列表页下有优势.客观来说,RecyclerView在特定场景下对ListView的缓存机制做了补强和完善。 缓存不同: 1). RecyclerView缓存RecyclerView.ViewHolder,抽象可理解为: View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态); 2). ListView缓存View。 缓存不同,二者在缓存的使用上也略有差别,具体来说: ListView获取缓存的流程: RecyclerView获取缓存的流程: 1). RecyclerView中mCacheViews(屏幕外)获取缓存时,是通过匹配pos获取目标位置的缓存,这样做的好处是,当数据源数据不变的情况下,无须重新bindView: 而同样是离屏缓存,ListView从mScrapViews根据pos获取相应的缓存,但是并没有直接使用,而是重新getView(即必定会重新bindView),相关代码如下: //AbsListView源码:line2345 //通过匹配pos从mScrapView中获取缓存 final View scrapView = mRecycler.getScrapView(position); //无论是否成功都直接调用getView,导致必定会调用createView final View child = mAdapter.getView(position, scrapView, this); if (scrapView != null) { if (child != scrapView) { mRecycler....

七月 6, 2018 · 1 分钟 · LengYue

Android 内存泄露实践分析

定义 ​内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。 内存泄漏形象的比喻是“操作系统可提供给所有进程的存储空间正在被某个进程榨干”,最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃。所以“内存泄漏”是从操作系统的角度来看的。这里的存储空间并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。由程序申请的一块内存,如果没有任何一个指针指向它,那么这块内存就泄漏了。 ​ ——来自《百度百科》 影响 导致OOM 糟糕的用户体验 鸡肋的App存活率 成效 内存泄露是一个持续的过程,随着版本的迭代,效果越明显 由于某些原因无法改善的泄露(如框架限制),则尽量降低泄露的内存大小 内存泄露实施后的版本,一定要验证,不必马上推行到正式版,可作为beta版持续观察是否影响/引发其他功能/问题 内存泄露实施后,项目的收获: OOM减少30%以上 平均使用内存从80M稳定到40M左右 用户体验上升,流畅度提升 存活率上升,推送到达率提升 类型 IO FileStream Cursor Bitmap Context 单例 Callback Service BraodcastReceiver ContentObserver Handler Thread 技巧 慎用Context Context概念 四大组件Context和Application的context使用参见下表 **善用Reference ** Java引用介绍 Java四种引用由高到低依次为:强引用 > 软引用 > 弱引用 > 虚引用 表格说明 **复用ConvertView ** 复用详解 对象释放 遵循谁创建谁释放的原则 示例:显示调用clear列表、对象赋空值 分析  原理 Java内存分配机制 Java垃圾回收机制 根本原因 关注堆内存 怎么解决 详见方案 实践分析...

七月 6, 2018 · 3 分钟 · LengYue

Android 增量更新

本文介绍的是如何实现Android 增量更新,而不是增量更新的深层次的原理 什么是增量更新 应用越做越大,可能只是一个小小的改动就需要重新下载安装整个APP,这种方式即增加了服务器的压力,又浪费了用户的流量,因此每当我们发布新版本的时候,一些用户升级并不是很积极,这就造成了新版本的升级率并不高。而google为了解决了这个问题,提出了Smart App Update,即增量更新(也叫做差分升级)。 ...

七月 6, 2018 · 1 分钟 · LengYue