Paging3研究
从DataSource开始1234567891011121314151617181920212223242526class ActivityListDataSource(val groupId: String, val activityType: String) : PagingSource<Int, GroupActivity>() { override suspend fun load(params: LoadParams<Int>): LoadResult<Int, GroupActivity> { Log.wtf("test", Exception()) return try { val curPage = params.key ?: 0 val pageData = SuspendGroupApi.fetchGroupActivities(groupId,...
横向粘性标题的研究
最近因为项目需求,需要实现一个类似于粘性标题的功能,具体效果见封面。思考了很久,也迭代了三个版本。 版本一这个版本使用了两个ViewPager2嵌套的方式,通过一个ViewGroup去协调两个ViewPager2的滑动事件。看代码: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051class NestedViewPager @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : FrameLayout(context, attrs, defStyleAttr) { private val mViewPager2: ViewPager2 = ViewPager2(context, attrs, defStyleAttr).apply { ...
自定义可以嵌套滑动的ListView
继承ViewGroupListView需要往里面添加子View,因此需要继承ViewGroup 12345class MyListView @JvmOverloads constructor( context:Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0):ViewGroup(context, attrs, defStyleAttr) kotlin的函数默认值虽然可以做到函数重载的效果,但是要兼容java的函数重载还是需要一个@JvmOverload注解。 重写OnMeasure方法这次我们只需要简单调用一下measureChildren想详细了解一下的可以,按住Ctrl+单击方法,可以进入方法内部,查看它的实现。 12345678910override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { super.onMeasure(widthMeasureSpec,...
自定义View遇到的问题
问题描述最近在写一个自定义天气折线图的时候遇到一个问题。在定义一个View的itemCount属性的时候需要用到View的width,我思路是在onLayout()中通过width初始化它的值,因为此时View已经确定了它的宽高了。 123456789101112131415161718private var itemCount = 1 set(value) { field = value itemWidth = width / value }private var itemWidth = width / itemCount set(value) { field = value beginX = value / 2 }private var beginX = itemWidth / 2override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int)...
开始了Android了的学习
我的《第一行代码》第三版到货了!非常的开心😀。同时也意味着我Android的学习就要开始了✊。 开始接触到了kotlin语言了,来说说它与Java的不同吧。🤞konlin的每一行代码是不用加’;’的,这让我有点不习惯。konlin的数据类型相较于java,它抛弃了我从c到java一直在用的基本数据类型,改用了包装类。另我惊喜的是konlin加入了类型推导机制,我可以不表明一个变量的类型是Int或String,它会自己去分辨。另一个新奇的是它对代码的简化,如下代码:fun largerNumber(num1: Int, num2: Int): Int = max(num1, num2)省略掉了原本的{}和return,不过这种写法的适用范围只有当函数里只有一条语句的时候。🤞 暂时学到了这里。持续更新中。。。