自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(160)
  • 资源 (6)
  • 收藏
  • 关注

原创 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 485

原创 RecyclerView滑动辅助

前言:LinearSnapHelper:滑动结束时让最靠近中间的位置的子条目居中;PagerSnapHelper不仅带有LinearSnapHelper居中的效果还带有ViewPager的效果,每次只能滑动一页(即快速滑动无惯性效果,而LinearSnapHelper则可以惯性继续滑动)

2023-09-07 10:20:05 153

原创 协程

一、a、b、c串行(launch效果同线程:对于{}内的代码顺序执行,与外层d并行,而不是当执行a挂起后才跳转到{}外执行d)注:a或b发生异常时父协程不会终止,但由于收不到子协程的结果导致一直等待,c无法执行。注:a或b发生异常时会导致父协程终止,从而导致其他子协程也都终止。1、launch + join方式。2、async + await方式。三、a、b并行,当都完成后执行c。

2023-08-10 23:49:00 124

原创 NumberPicker注意事项

2、displayedValues:自定义显示内容的集合(注意由大范围变小先设置maxValue再设置displayedValues,由小范围变大先设置displayedValues再设置maxValue)3、wrapSelectorWheel = false,由小范围变大失效问题(通过下面的方法即可避免数组越界也解决了循环滚动标识失效问题)1、wrapSelectorWheel:是否循环滚动标识(注意调用顺序否则无效:要在设置完最小和最大值后调用)

2023-08-10 10:13:55 143

原创 kotlin获取泛型集合的类型信息

关键字和内联函数来实现。

2023-07-26 18:33:02 579

原创 SimplePool与SynchronizedPool

(四)SyschronizedPool是SimplePool的子类,通过对acquire()和release()方法加锁实现。(三)通过release(T obj)方法将对象放到数组里,如果数组已存在该对象则抛异常,不存在且数组没有满则添加。(二)acquire()从后向前取值,如果有值则返回该值,直到数组头仍无值则返回null。简介:对象池,适用于频繁创建和回收对象场景,通过复用对象池的对象实现。(一)内部通过数组存储。

2023-07-25 16:22:16 247

原创 kotlin类

3、需要返回值的when,全部列出子类则无需定义else(如果直接使用when而不使用其返回值,即使未全部罗列也没有定义else也不会有异常提示)6、重新了hashCode和equals方法:全部参数值相等,则对象相等(注:不是同一个对象,===仍为false)内部类:嵌套类加上inner,持有外部类引用,对应Java的非静态内部类。3、不可以声明为abstract、open、sealed和inner。2、子类必须与密封类在同一个文件中,而子类的派生类可以在其他文件中。1、可以定义抽象方法。

2023-07-10 17:42:15 417

原创 升级target

3、gradle使用Java11。1、target升级至31以上。4、修改grade插件版本。2、需要使用Java11。

2023-05-18 01:16:49 116

原创 Android12特性及适配

1、Android12及以上系统注册四大组件需要设置android:exported属性。

2023-05-17 15:20:18 88

原创 IdleHandler

注:(1)返回值为false即只执行1次,为true则可以重复执行(当再次触发空闲情况)(2)addIdleHandler内部是列表存储空闲任务。前言:当空闲才会被执行,空闲指的是MessageQueue为空或者要执行的消息还没到执行时间。

2023-05-11 17:05:08 92

原创 Handler同步屏障

message的tartget为空的消息,该消息是通过MessageQueue.postSyncBarrier方法(虽然是public但@hide注解无法直接调用,只能通过反射)1、消息执行到屏障消息时将只执行消息队列里的异步消息,这里并不是开启线程异步处理,只是筛选作用,直到移除屏障后同步消息才能执行。2、异步消息如果没有屏障会认为普通消息处理,只当发生屏障后才能体现出特权。(1)同步消息(普通消息)一、message类型。

2023-05-11 16:46:25 169

原创 枚举替代

setModel方法只能传1或2,其他数值编译不通过,起到约束作用。前言:通过默认注解方式替换枚举,例如IntDef。

2023-05-04 16:18:47 55

原创 进程通信--共享内存

1、进程A创建内存文件,并进行数据写入,然后获取该文件的描述,并将其序列化(进程传输必须序列化)3、进程B获取到文件描述,通过常规读取文件方式获取数据。前言:binder通信存在1M限制,而共享内存无此限制。2、通过aidl讲文件描述提供给进程B。

2023-04-22 21:24:01 68

原创 Android8.0注意事项

2、fullscreen 表示Activity是否是透明的或者是否悬浮在Activity上。(2)“windowIsTranslucent” 为 false,但“windowSwipeToDismiss” 为 true;原因:在 8.0系统中,targetSdkVersion > 26,透明 Activity 不能设置方向。表示判断当前的 Activity是否固定了方向,true为固定了方向。3、重写设置屏幕方法,对于透明主题不执行相关设置。2、透明主题则设置屏幕方向为不固定方式。1、判断是否为透明主题。

2023-03-30 15:43:57 242

原创 Java函数接口

有,在java.util.function包下,但Android中使用需要最新系统版本为24,不过我们可以按照系统提供的自己创建一个这个的接口就可以在低版本中使用了。Java1.8新增特性,即为只有一个抽象方法的接口(通过@FunctionalInterface进行约束),但可以允许存在默认方法、静态方法。三、是否有自带的函数接口?

2023-03-30 00:03:03 64

原创 Java接口

场景1:两个接口包含同名默认方法(或1个抽象1个默认或两个抽象),则实现此两个接口的实现类需要重写该同名方法(其中可以通过“父接口.super.方法名”调用父接口的默认方法)答:可以,从Java1.8版开始可以通过关键字default添加默认方法(只能用于接口)或static添加静态方法。接口添加抽象方法,则实现类都要去实现该方法,而默认方法只需在需要的实现类里重写该方法即可,不用改动其他实现类。爷接口定义抽象方法,父接口定义同名的默认方法,则子接口或类不用必须实现抽象方法。一、接口可以定义实现的方法吗?

2023-03-29 21:20:17 43

原创 RecyclerView懒加载失效问题(三)

嵌套滑动

2022-09-16 16:49:32 928

原创 Android Studio打jar包

Android Studio打jar包

2022-06-24 17:44:19 705

原创 Flow

介绍:Flow是google官方提供的一套基于kotlin协程的数据流处理模型,类似RxJava。另外Flow作用在协程内,可以与协程的生命周期绑定,当协程取消时,Flow也会被取消,避免了内存泄漏风险,这点又类似LiveData。因此Flow可以用来替代LiveData和RxJava。LiveData不支持线程切换,数据更新都是在主线程完成,对于频繁切换线程处理比较麻烦。RxRava操作符较多,入门门槛较高,另外未关联生命周期,需要自己处理取消订阅。使用:1、创建flow//方式1val

2022-05-11 19:37:45 492

原创 基于LiveData实现事件总线

前言:提及事件总线常常使用org.greenrobot:eventbus框架,而本文通过LiveData即可轻松实现Eventbus。实现:这里只定义了1个LiveData,通过TAG作事件的区分。1、定义事件基类data class BaseEvent<T>( val tag: Int, val msg: T)2、定义事件操作类object EventBus{ val onEventLiveData = MutableLiveData<Base

2022-04-26 17:23:06 483

原创 共享状态

前言:如页面A和页面B都需要数据Name,如果定义为全局变量,但当在B页面中修改后还需要手动通知A页面进行更新,增加维护成本和出错率。本文介绍通过Provider将数据和Widget进行关联,之后更新数据则相关联的Widget自动刷新。类似Android的DataBinding。正文:1、添加Provider依赖provider: ^3.0.02、定义有状态的数据(只需继承ChangeNotifier,并在set方法中添加notifyListeners()即可)import 'packag

2022-04-25 14:54:13 1367

原创 flutter代码提示失效

前言:Android studio打开Android项目编写代码能够正常提示,但在flutter项目中编写且没有代码提示。解决:在Terminal执行"flutter pubget"即可

2022-04-24 17:27:55 3613

原创 flutter国际化

flutter国际化

2022-04-20 18:54:47 1343

原创 Android studio打jar包

原理:项目构建生成的class.jar即为我们需要的jar,下面的操作只是将这个jar包拷贝到指定的目录并重命名一下。1、创建新建Android Library 如名称为lib-test,编写业务代码。package com.lpf.lib;public class TestUtil { public static String getString(){ return "这是结果!"; }}2、lib-test的build.gradle中添加如下代码,检

2022-04-20 14:57:49 3503

原创 Isolate

前言:Isolate译为隔离,区别于java的线程,由于内存是隔离的,更类似进程。sync和await则是在Isolate中将任务添加到事件队列,await中的任务和await外的任务是并发的,但await中的任务之间是根据队列顺序执行的详见。使用: SendPort newSendPort; static int num = 0; //该方法内部运行在MainIsolate Future<void> test() async { //创建接收端口 Re

2022-04-15 09:52:09 204

原创 Flutter抓包

前言:通过Charles进行抓包步骤:1、查看Charles代理地址Help->SSL Proxying->Install Charles Root Certificate on a Mobile Device or Remote Browser2、配置代理 (_dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (HttpClient client) {

2022-04-11 16:48:29 2327

原创 Future

Future是通过Event队列(先进先出)处理的异步任务。因此需要注意:future并非并发执行,而是按加入到Event队列顺序执行,下面的例子即可说明。 void main(){ Future.delayed(Duration(seconds: 1), (){ print("*******事件1开始"); }); Future((){ print("*******事件2开始"); sleep(Duration(seconds: 5));

2022-04-08 15:31:18 247

原创 重载运算符plus

使用场景:通过+号实现对象属性的叠加class Test(var num: Int) { operator fun plus(t: Test): Test{ num += t.num return this }}private fun test(){ val t = Test(1) t + Test(2) + Test(3) val result = t.num//结果为6}理解了plus的原理,还可以通过+号实现链

2022-04-07 15:04:27 568

原创 密封函数sealed

sealed密封类使用场景:增强版的枚举类型,不同之处在于枚举的实例是唯一的,而密封类可以有很多实例(如下TestA实例是唯一的,而TestB则可以创建多个实例)sealed class Test { object TestA : Test() class TestB(value: String) : Test()} private fun test(t: Test) = when(t){ Test.TestA ->{} is Te

2022-04-07 14:22:40 324

原创 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 1845

原创 Android Studio 无法搜索插件

前言:搜索插件一直在加载中或搜索不到,这里介绍一种方案解决:访问JetBrains Marketplace搜索下载插件,再通过磁盘方式导入即可

2022-03-23 14:13:44 428

原创 序列化和反序列化

前言:将继承Serializable的实体类通过如下方法序列化成字符串,并以SharedPreferences方式保存,当对该实体类添加属性后,再对存储的字符串进行反序列化则会触发java.io.InvalidClassException/** * 序列化对象 */ @Throws(IOException::class) private fun <A> serialize(obj: A): String { val byteArrayOu

2022-03-18 18:45:48 2938

原创 挂起函数suspend

kotlin挂起函数+ViewModel,使异步如此简单。

2022-02-10 10:38:44 1588

原创 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 246

原创 Stream

前言:Stream和Future均属于dart.async下的核心库,是dart提供的异步操作类。正文:一、Stream创建方式1、Stream.fromFuture通过future对象创建Stream.fromFuture(init(1));//初始化函数Future init(int a) async{ await Future.delayed(Duration(seconds: 10 - a));}2、Stream.fromIterable通过集合创建Strea

2021-12-23 11:52:56 1214

原创 减少shape文件

前言:通常设置控件背景色、圆角、边框大小、边框颜色,是通过自定义shape文件做为背景设置给控件,虽然在布局文件里能直接看到效果,同时还能让背景支持selector标签的资源文件,但对于简单的设置每次都要创建shape文件也挺繁琐的,于是本文通过动态代码方式进行设置进行简化分析:控件的背景样式其实是通过GradientDrawable来实现的,只要将GradientDrawable设置成自定义样式,然后将控件的背景设置为该GradientDrawable即可。实现:object ViewUti

2021-12-06 11:30:50 1358

原创 文本折叠展开效果

前言:当文本过长时(超过指定行数),打点省略显示并在其后添加“展开”,点击则展开显示全部,再次点击收起,效果如下分析:(1)超过n行折叠 (2)“【展开】”内嵌至文本中且通过颜色标识(3)点击展开收缩方案一:计算n行的总长度,获取“【更多】”所占长度,两者差值即为能容纳的字符串长度,截取字符串之后再拼接上“【更多】”即可object TextUtil{ /** * textView:文本控件 * textStr:文本内容 * lineWidth:行.

2021-11-19 12:00:32 269

原创 async、await

前言:1、问题1:在shared_preferences存储着是否登录的状态,然后根据状态决定跳转的页面,但获取该状态是异步,而页面需要同步方式获取Weight。解决:对shared_preferences在页面运行前进行初始化,将异步转换为同步。class SpUtil { static SharedPreferences _sp; static Future init() async{ _sp = await SharedPreferences.getInstance(

2021-10-21 12:11:36 123

原创 RecyclerView滑动到指定位置

需求:将recyclerview滑动到指定位置,且该位置为第一个可见位置方式一:LayoutManager.scrollToPositionWithOffsetint toPosition = 5;((LinearLayoutManager)rvSaleMonth.getLayoutManager()).scrollToPositionWithOffset(toPosition, 0);方式二:RecyclerView.scrollToPosition + RecyclerView.scro

2021-09-26 14:55:53 1499

原创 java替换括号内字符串

背景:例如字符串“这是[XX]”,XX为任意字符串,我们需求是将XX替换为想要的字符串解决:采用正则表达式.*?进行任意字符匹配String remark = "这是[苹果]";remark = remark.replaceAll("\\[.*?\\]", "[香蕉]");...

2021-09-23 17:24:53 1745

unlocker.rar

这是一款支持VMware1.5版解锁MacOs工具,使用步骤如下: 1、下载unlocker.zip文件并将其解压文件夹保存至VMware安装目录下 2、任务管理器中结束所有VMware进程 3、以管理员身份运行win-install.cmd或已管理员身份执行unlocker.exe

2020-05-09

fragment多种切换动画效果

该资源包含fragment自定义切换动画的多种效果,能满足大部分需要,另外可以基于这些动画进行扩展。

2020-04-01

Chrome工具包(附相应版本浏览器).rar

该资源包含Chrome浏览器安装包、离线工具包及其使用方法,如果在已安装自己的Chrome浏览器基础上使用离线工具包后可正常使用则无需安装提供的Chrome浏览器,否则你可以下载我提供相同版本的浏览器或直接安装。

2019-12-30

POS研发工具包.zip

POS研发工具包旨在方便对POS刷卡操作的开发和调试,其中8583报文解析工具前4个字符表示长度,如果报文未包含长度,请自己添加0000占位符。

2019-07-22

openssll.exe下载

openssll.exe使用方便,在Windows系统cmd命令行对签名文件加密时使用到openssll命令,提示'openssll' 不是内部或外部命令,也不是可运行的程序,只需将该文件放置当前目录下即可

2017-11-01

第二行代码(源码)

包含第二行代码中全部源码,仅供学习参考。

2017-03-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除