京东面试笔试题,LiveData,最新阿里Android面试题目

override fun onChanged(show: Boolean?) {

if (show == null) return

if (show) {

dialog.show()

} else {

dialog.dismiss()

}

}

}

然后在MainActivity添加这个Observer

vm.loading.observe(this, LoadingObserver(this))

效果:

[外链图片转存失败(img-2JCQNDTS-1568877294858)(https://upload-images.jianshu.io/upload_images/15679108-66b1b55491ca6473?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 “加载对话框显示”)]

加载对话框显示

我们还可以将LoadingObserver注册到BaseActivity

class BaseActivity : AppCompatActivity() {

val loadingState = MutableLiveData()

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

loadingState.observe(this, LoadingObserver(this))

}

}

然后在HomeVM中添加一个attachLoading方法

class HomeVM:ViewModel{

fun attachLoading(otherLoadingState: MutableLiveData) {

loading.observeForever {

otherLoadingState.value = it

}

}

}

最终如果想要显示进度对话框,在BaseActivity到子类中,只需调用vm.attachLoading(loadingState)即可。

分页请求

分页请求是另个一常用请求,它的请求状态就比刷新数据多了几种。以wanandroid首页文章列表api为例,我们在HomeVM中加入page,refreshing,moreLoading,hasMore变量控制分页请求

private val page = MutableLiveData() //分页数据

val refreshing = MutableLiveData()//下拉刷新状态

val moreLoading = MutableLiveData()//上拉加载更多状态

val hasMore = MutableLiveData()//是否还有更多数据

private val articleList = Transformations.switchMap(page) {

api.articleList(it)

}

val articlePage = Transformations.map(articleList) {

refreshing.value = false

moreLoading.value = false

hasMore.value = !(it?.data?.over ?: false)

it.data

}

fun loadMore() {

page.value = (page.value ?: 0) + 1

moreLoading.value = true

}

fun refresh() {

loadBanner()

page.value = 0

refreshing.value = true

}

用SmartRefreshLayout作为分页组件,来实现WanAndroid首页文章列表数据的展示。

绑定SmartRefreshLayout属性和事件

通过@BindingAdapter注解,将绑定SmartRefreshLayout属性和事件封装一样,便于我们在布局文件通过databinding控制它。

新建一个CommonBinding.kt文件,注意在gradle中引入kotlin-kapt

@BindingAdapter(value = [“refreshing”, “moreLoading”, “hasMore”], requireAll = false)

fun bindSmartRefreshLayout(

smartLayout: SmartRefreshLayout,

refreshing: Boolean,

moreLoading: Boolean,

hasMore: Boolean

) {

if (!refreshing) smartLayout.finishRefresh()

if (!moreLoading) smartLayout.finishLoadMore()

smartLayout.setEnableLoadMore(hasMore)

}

@BindingAdapter(value = [“onRefreshListener”, “onLoadMoreListener”], requireAll = false)

fun bindListener(

smartLayout: SmartRefreshLayout,

refreshListener: OnRefreshListener?,

loadMoreListener: OnLoadMoreListener?

) {

smartLayout.setOnRefreshListener(refreshListener)

smartLayout.setOnLoadMoreListener(loadMoreListener)

}

然后在布局中使用

<layout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:app=“http://schemas.android.com/apk/res-auto”

xmlns:tools=“http://schemas.android.com/tools”>

<variable

name=“vm”

type=“io.github.iamyours.wandroid.ui.home.HomeVM”/>

<com.scwang.smartrefresh.layout.SmartRefreshLayout

android:id=“@+id/refreshLayout”

android:layout_width=“match_parent”

app:onRefreshListener=“@{()->vm.refresh()}”

app:refreshing=“@{vm.refreshing}”

app:moreLoading=“@{vm.moreLoading}”

app:hasMore=“@{vm.hasMore}”

app:onLoadMoreListener=“@{()->vm.loadMore()}”

android:layout_height=“match_parent”>

<androidx.core.widget.NestedScrollView

android:layout_width=“match_parent”

android:layout_height=“match_parent”>

<LinearLayout

android:layout_width=“match_parent”

android:orientation=“vertical”

android:layout_height=“wrap_content”>

<cn.bingoogolapple.bgabanner.BGABanner

android:id=“@+id/banner”

android:layout_width=“match_parent”

android:layout_height=“140dp”

app:banner_indicatorGravity=“bottom|right”

app:banner_isNumberIndicator=“true”

app:banner_pointContainerBackground=“#0000”

app:banner_transitionEffect=“zoom”/>

<androidx.recyclerview.widget.RecyclerView

android:id=“@+id/recyclerView”

android:layout_width=“match_parent”

android:layout_marginTop=“5dp”

tools:listitem=“@layout/item_article”

android:layout_height=“wrap_content”/>

</androidx.core.widget.NestedScrollView>

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后的最后

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的

最后,互联网不存在所谓的寒冬,只是你没有努力罢了!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

ING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》]( )收录**

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值