Android
yufumatou
这个作者很懒,什么都没留下…
展开
-
RecyclerView实现选中的item居中
实现:(1)LinearShapHelper可以实现控件自动修正至居中,但由于惯性加速度的影响使得目标view并非是距离中心位置最近的那个,需要重写findSnapView方法,实现指定我们想要选中的view(2)由于每个item的宽度都比RecyclerView小,二、(1)抬起手指时,能够让距离RecyclerView中心位置最近的控件正好居中(2)惯性滚动最多只能滚动1个item。实现:设置第1个item的左边距和最后一个item的右边距。PagerShapHelper无效。原创 2024-03-24 00:58:47 · 379 阅读 · 0 评论 -
RecyclerView滑动辅助
前言:LinearSnapHelper:滑动结束时让最靠近中间的位置的子条目居中;PagerSnapHelper不仅带有LinearSnapHelper居中的效果还带有ViewPager的效果,每次只能滑动一页(即快速滑动无惯性效果,而LinearSnapHelper则可以惯性继续滑动)原创 2023-09-07 10:20:05 · 142 阅读 · 0 评论 -
SimplePool与SynchronizedPool
(四)SyschronizedPool是SimplePool的子类,通过对acquire()和release()方法加锁实现。(三)通过release(T obj)方法将对象放到数组里,如果数组已存在该对象则抛异常,不存在且数组没有满则添加。(二)acquire()从后向前取值,如果有值则返回该值,直到数组头仍无值则返回null。简介:对象池,适用于频繁创建和回收对象场景,通过复用对象池的对象实现。(一)内部通过数组存储。原创 2023-07-25 16:22:16 · 243 阅读 · 0 评论 -
升级target
3、gradle使用Java11。1、target升级至31以上。4、修改grade插件版本。2、需要使用Java11。原创 2023-05-18 01:16:49 · 100 阅读 · 0 评论 -
Handler同步屏障
message的tartget为空的消息,该消息是通过MessageQueue.postSyncBarrier方法(虽然是public但@hide注解无法直接调用,只能通过反射)1、消息执行到屏障消息时将只执行消息队列里的异步消息,这里并不是开启线程异步处理,只是筛选作用,直到移除屏障后同步消息才能执行。2、异步消息如果没有屏障会认为普通消息处理,只当发生屏障后才能体现出特权。(1)同步消息(普通消息)一、message类型。原创 2023-05-11 16:46:25 · 164 阅读 · 0 评论 -
进程通信--共享内存
1、进程A创建内存文件,并进行数据写入,然后获取该文件的描述,并将其序列化(进程传输必须序列化)3、进程B获取到文件描述,通过常规读取文件方式获取数据。前言:binder通信存在1M限制,而共享内存无此限制。2、通过aidl讲文件描述提供给进程B。原创 2023-04-22 21:24:01 · 67 阅读 · 0 评论 -
RecyclerView懒加载失效问题(三)
嵌套滑动原创 2022-09-16 16:49:32 · 910 阅读 · 0 评论 -
Flow
介绍:Flow是google官方提供的一套基于kotlin协程的数据流处理模型,类似RxJava。另外Flow作用在协程内,可以与协程的生命周期绑定,当协程取消时,Flow也会被取消,避免了内存泄漏风险,这点又类似LiveData。因此Flow可以用来替代LiveData和RxJava。LiveData不支持线程切换,数据更新都是在主线程完成,对于频繁切换线程处理比较麻烦。RxRava操作符较多,入门门槛较高,另外未关联生命周期,需要自己处理取消订阅。使用:1、创建flow//方式1val原创 2022-05-11 19:37:45 · 483 阅读 · 0 评论 -
GreenDao
一、数据库升级(如增加字段)1、增加phone@Entitypublic class UserModel { @Id(autoincrement = true) private Long id; //主键 private String name; //姓名 private String phone;//电话}2、修改版本号1->2greendao { //数据库的版本 schemaVersion 2 //设置DaoMas原创 2022-03-25 11:57:03 · 1827 阅读 · 0 评论 -
序列化和反序列化
前言:将继承Serializable的实体类通过如下方法序列化成字符串,并以SharedPreferences方式保存,当对该实体类添加属性后,再对存储的字符串进行反序列化则会触发java.io.InvalidClassException/** * 序列化对象 */ @Throws(IOException::class) private fun <A> serialize(obj: A): String { val byteArrayOu原创 2022-03-18 18:45:48 · 2922 阅读 · 0 评论 -
挂起函数suspend
kotlin挂起函数+ViewModel,使异步如此简单。原创 2022-02-10 10:38:44 · 1585 阅读 · 0 评论 -
Collections.sort注意事项
排序无考虑相等情况,可能导致如下情况(不是必现的,场景依赖集合大小【>=32】和数据在排序算法关键位置恰好相等【如下例是倒序则有问题,正序则不发生异常】,具体原理)List<String> aa = new ArrayList();aa.add("2021-11-02 13:07:44.0");aa.add("2021-11-02 13:07:45.0");for (int i = 0; i < 10; i ++){ aa.add("2021-11-02 13:0原创 2022-01-26 18:40:47 · 245 阅读 · 0 评论 -
减少shape文件
前言:通常设置控件背景色、圆角、边框大小、边框颜色,是通过自定义shape文件做为背景设置给控件,虽然在布局文件里能直接看到效果,同时还能让背景支持selector标签的资源文件,但对于简单的设置每次都要创建shape文件也挺繁琐的,于是本文通过动态代码方式进行设置进行简化分析:控件的背景样式其实是通过GradientDrawable来实现的,只要将GradientDrawable设置成自定义样式,然后将控件的背景设置为该GradientDrawable即可。实现:object ViewUti原创 2021-12-06 11:30:50 · 1355 阅读 · 0 评论 -
文本折叠展开效果
前言:当文本过长时(超过指定行数),打点省略显示并在其后添加“展开”,点击则展开显示全部,再次点击收起,效果如下分析:(1)超过n行折叠 (2)“【展开】”内嵌至文本中且通过颜色标识(3)点击展开收缩方案一:计算n行的总长度,获取“【更多】”所占长度,两者差值即为能容纳的字符串长度,截取字符串之后再拼接上“【更多】”即可object TextUtil{ /** * textView:文本控件 * textStr:文本内容 * lineWidth:行.原创 2021-11-19 12:00:32 · 263 阅读 · 0 评论 -
RecyclerView滑动到指定位置
需求:将recyclerview滑动到指定位置,且该位置为第一个可见位置方式一:LayoutManager.scrollToPositionWithOffsetint toPosition = 5;((LinearLayoutManager)rvSaleMonth.getLayoutManager()).scrollToPositionWithOffset(toPosition, 0);方式二:RecyclerView.scrollToPosition + RecyclerView.scro原创 2021-09-26 14:55:53 · 1487 阅读 · 0 评论 -
BroadcastReceiver
一、类型1、无序广播sendBroadcast(intent)2、有序广播(根据优先级顺序接收广播)sendOrderedBroadcast(intent, receiverPermission)sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras)注:(1)可以编辑传递信息和终止广播over原创 2021-08-06 18:43:22 · 63 阅读 · 0 评论 -
Service
一、启动方式1、startService继承Service并注册即可2、bindService(1)继承Service并注册(2)创建自定义Binder类并在Service的onBind()中返回class MyService : Service() { var aa = "" inner class MyBinder : Binder() { val service = this@MyService } override fun原创 2021-08-05 18:46:31 · 130 阅读 · 0 评论 -
TextView自动调节字体大小
前言:从Android8.0开始TextView支持自动调节字体大小,使其缩放至填满TextView,由于api26才开始支持该特性,我们采用com.android.support:appcompat-v7:26.0.0及以上的支持包即可支持api14以上。(即如下采用app:autoSizeTextType而非android:autoSizeTextType)1、自动缩放(当文字少时放大,文字多时缩小至填满水平或垂直方向)<TextView android:layout_w原创 2021-07-30 18:49:57 · 4237 阅读 · 0 评论 -
SharedPreferences
一、获取方式1、在activity中通过getPreferences(int mode)获取,作用域为当前activity2、context.getSharedPreferences(String fileName, int mode),作用域为整个APP二、模式介绍1、Context.MODE_PRIVATE默认模式,数据私有,作用域为当前APP,写入内容覆盖原有内容2、Context.MODE_APPEND数据私有,作用域为当前APP,写入内容追加原有内容后3、Conte原创 2021-07-27 14:36:55 · 127 阅读 · 0 评论 -
ConstraintLayout
一、强制约束app:layout_constrainedWidth=”true|false” //默认falseapp:layout_constrainedHeight=”true|false” //默认false例:控件B在控件A右边和父右边之间居中显示当B内容过多,则超出A右边限制设置app:layout_constrainedWidth="true",则可以在之间显示补充:另外可以通过该属性可以轻松满足此需求(控件A、B横向顺序链表排列,B始终单行显示全部,A包裹内.原创 2021-07-15 20:01:31 · 337 阅读 · 1 评论 -
RecycleView拖动效果
前言:基于RecycleView实现拖动效果,其实很简单,只需使用系统提供的ItemTouchHelper即可满足大部分需求。实现:原创 2021-06-26 18:03:13 · 670 阅读 · 1 评论 -
RecycleView懒加载失效问题(二)
前言:继《RecycleView懒加载失效问题》之后,再介绍另一个场景,如下图。两层RecycleView,外层是竖向列表样式,内层是网格样式,由于内层网格个数不固定,需要内层RecycleView的根布局高度为wrap_content(注:这是导致内层RecycleView懒加载失效的原因)问题:尽管第2项只显示了一小部分,但仍加载了全部数据,内层懒加载失效,当内层数据量很大,一次要全部加载,会感觉到卡顿。分析:首先,分析为什么外层的RecycleView懒加载正常,而内层的RecycleVi原创 2021-06-10 17:14:31 · 1476 阅读 · 2 评论 -
RecycleView懒加载失效问题
前言:当数据量比较大(如200条以上)明显感觉到APP卡顿,通过排查发现是RecycleView适配器的onBindViewHolder有多少条数据就执行多少次,滑动显示懒加载失效了。原因:RecycleView或父控件在水平方向使用android:layout_weight="1"属性则会导致RecycleView懒加载无效<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http:/原创 2021-05-25 14:31:45 · 698 阅读 · 1 评论 -
startActivityForResult的坑
问题:在fragment中startActivityForResult(msgIntent, Const.JumpRequestCode.REQUEST_MODIFY_CUSTOMER_MSG);然后在宿主activity中onActivityResult(int requestCode, int resultCode, Intent data),我们需要根据requestCode做不同处理,然而这里的requestCode怎么也不是我请求时的Const.JumpRequestCode.REQUEST_原创 2021-05-14 19:00:40 · 289 阅读 · 0 评论 -
RecycleView高度显示问题
问题:RecycleView高度设置为“wrap_content”而实际效果为“match_parent”解决:将RecycleView版本更新至23.2.0及以后版本即可原创 2021-03-12 11:08:05 · 130 阅读 · 0 评论 -
Android view获取方式演进
一、findViewById缺点:代码量大,繁琐二、butterknife缺点:组件化开发中使用不友好(注意事项:https://blog.csdn.net/yufumatou/article/details/109583839)三、kotlin-android-extensions优点:最简单,只需通过id即可缺点:1、只能支持Kotlin语言,而无法支持Java语言2、在Recyclerview适配器中需要避免入坑class OrderAdapter(val ord原创 2021-01-25 18:30:23 · 217 阅读 · 0 评论 -
RecyclerView滑动加载更多
前言:本文介绍无需第三方库,只是通过RecyclerView即可简单实现下拉刷新和上拉加载更多。方案:1、RecyclerView注册滑动监听addOnScrollListener(RecyclerView.OnScrollListener listener)2、判断是否还能向上滑动,不能则进行加载下一页数据。canScrollVertically(int direction)实现:recyclerView.addOnScrollListener(new RecyclerView.On原创 2021-01-15 10:30:10 · 769 阅读 · 0 评论 -
RxTextView.textChanges注意事项
问题:当执行subscribe进行订阅时则会执行一次Log.i,尽管myTextView此时为进行任何赋值操作,这显然不是我们想要的当文本发生改变时才进行通知RxTextView.textChanges(myTextView).subscribe{ charSequence -> Log.i("aa", "*******$charSequence")}解决:既然没有简单的不让它订阅时只需通知,我们可以通过标识来控制是否执行我们的业务...原创 2021-01-27 18:27:14 · 858 阅读 · 0 评论 -
系统时间相关广播
一、Intent.ACTION_DATE_CHANGED (日期改变广播)1、系统日期自动改变不会发送该广播2、用户手动更改日期,只有修改为之后日期时才会发生该广播,否则不发送二、Intent.ACTION_TIME_CHANGED (时间改变广播)1、系统时间自动改变不会发送该广播2、用户手动更改日期或时间均发送该广播三、Intent.ACTION_TIME_TICK (时间改变广播)系统时间自动改变会发送该广播,可以通过该广播进行整点播报功能public clas...原创 2021-02-18 19:07:17 · 1361 阅读 · 0 评论 -
Fragment嵌套子Fragment不显示问题
前言:维护他人项目中,遇到当activity被回收重新恢复时(可以通过开发者不保留活动进行模拟),Fragment嵌套的子Fragment不显示,这个问题之前一直也没有遇到过,而且打断点也发现子fragment也执行生命周期了啊,但是就不显示。解决:排查代码发现在fragment中设置子fragment使用的是getActivity().getSupportFragmentManager(),修改为getChildFragmentManager()后问题解决了总结:fragment要规范使用,如果是原创 2021-01-14 20:00:35 · 1173 阅读 · 1 评论 -
事件分发
前言:下面是事件分发流程,其中蓝色表示Activity,粉色表示ViewGroup,黄色表示View总结:事件是通过父控件流向子控件,父控件可以通过自身dispatchTouchEvent、onInterceptTouchEvent返回值控制是否传递给子控件,而子控件可以通过getParent().requestDisallowInterceptTouchEvent()来影响父控件是否拦截事件。我们可以根据实际需求对照事件分发流程在适合的方法中进行控制来解决事件冲突。...原创 2020-12-16 18:33:54 · 147 阅读 · 0 评论 -
屏幕适配方案
前言:屏幕适配说白了就是将设计图按宽或高进行整体等比缩放。方案:如设计图分辨率(宽360px,高560px),手机屏分别率(宽1080px,高1920px),按宽进行适配需要将设计图的控件尺寸宽高等比放大(手机屏宽1080px / 设计图宽360px = 3)倍,而获取xml中定义的所有控件再分别对宽高放大3倍,这操作我们通过代码实现,显然很繁重,然而我就将这部分工作交给系统,要知道控件在系统中宽高最终都转成px(px= density * dp),我们就巧妙利用系统的转换公式,将density = 手原创 2020-11-12 15:03:37 · 1641 阅读 · 7 评论 -
butterknife注意事项
一、需要配置java8compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}二、Android studio3.0之后,annotationProcessor代替apt,无需再引用apt插件(3.0之前,项目根build.gradle中添加classpath 'com.neenbedankt.gradle.plugins:an原创 2020-11-10 10:11:21 · 135 阅读 · 0 评论 -
列表过滤
前言:根据输入框内容过滤出列表中满足要求的数据方案:通过Filter进行过滤(轻松实现子线程中进行过滤,主线程刷新UI)1、自定义Adapter实现Filterable接口的getFilter()class NumberAdapter(context: Context, numberList: List<String>) : RecyclerView.Adapter<NumberAdapter.NumberViewHolder>(), Filterable{原创 2020-10-30 14:56:29 · 257 阅读 · 0 评论 -
动态更新桌面图标
前言:每当临近双十一,手机里一些购物的APP桌面logo都在无感知情况下换成了活动主题logo。方案:(1)热更新(2)使用Activity-alias,本文主要介绍该方式实现:1、AndroidManifest.xml中添加activity-alias<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_nam原创 2020-10-29 15:05:20 · 534 阅读 · 0 评论 -
GradientDrawable
一、GradientDrawable是什么?GradientDrawable是shape标签的代码实现。对于项目中非通用的样式,可以通过代码创建或修改公共样式,无需针对每个样式创建一个.xml文件实现。二、GradientDrawable怎么使用?1、新创建GradientDrawable background = new GradientDrawable();background.setColor(Color.RED);view.setBackgroundDrawable(bac原创 2020-09-28 12:27:31 · 240 阅读 · 0 评论 -
自定义View--绘制
一、paint相关Paint.setStyle(Style style) 设置绘制模式:实心(FILL)、空心(STROKE)Paint.setColor(int color) 设置颜色Paint.setStrokeWidth(float width) 设置线条宽度Paint.setStrokeCap(int cap) 设置端点样式:圆头 (ROUND)、平头 (BUTT) 和方头 (SQUARE)Paint.setTextSize(float textSize) 设置文字大小Paint.se.原创 2020-09-16 19:36:29 · 224 阅读 · 0 评论 -
gradle花样打包配置
前言:在无需修改代码情况下,如何对同一套代码打包成多不同种安装包(这几个APP可以同时安装不会覆盖),或打同种但不同环境(如线上、测试)的安装包?方案:1、打不同种安装包(1)build.gradle关键配置android { compileSdkVersion 28 buildToolsVersion '28.0.3' flavorDimensions "app" defaultConfig { multiDexEnabled = true.原创 2020-09-03 20:56:04 · 966 阅读 · 0 评论 -
Recyclerview 刷新
前言:recyclerview比起listview功能上更加丰富外(如横向列表),在Item复用上也更加灵活,比如listview的某个Item数据需要更新,要通过notifyDataSetChanged方法对全部Item进行刷新,而recyclerview则可以精准刷新。介绍:(1)notifyItemChanged(position)只刷新该position的Item,即只是该Item调用onBindViewHolder,因此如果对数据源进行插、移除操作不能改方法只刷新操作的Item,毕竟该原创 2020-08-21 15:09:51 · 4487 阅读 · 0 评论 -
无内存泄漏Handler的实现
前言:handler通过内部类方法创建(如下),而这种方式往往会导致内存泄漏(熟悉Handler消息机制的都知道,mHandler会作为成员变量保存在发送的消息msg中,即msg持有mHandler的引用,而mHandler是Activity的非静态内部类实例,即mHandler持有Activity的引用,那么我们就可以理解为msg间接持有Activity的引用。msg被发送后先放到消息队列MessageQueue中,然后等待Looper的轮询处理(MessageQueue和Looper都是与线程相关联的,原创 2020-07-16 11:24:44 · 185 阅读 · 0 评论