同步操作将从 Iklm/SmartCity_Course 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
QQ: 2506789532
WX: wjk655955
Android studio: 2022(使用最新版本)
Gradle: 1.8
本教程是根据我在比赛的时候,是如何一步一步的开发 智慧城市App 的
所需要的插件比赛会提供,以下是我在比赛时所用到的插件:
现在我们开始进行开发吧!
比赛时提供AS自带的Bottom Navigation的,我们直接使用AS自带的创建项目就好了,不用手写底部导航栏。
点击完成就ok了
等待下载依赖
点击项目的build.gradle, 默认时只有*.jar, 我们手动添加 *.aar, 就可以加载带.aar的插件依赖了
dashboard: 底部导航栏 - 全部服务
data: 底部导航栏 - 数据分析(根据比赛提供题目来设置)
home: 底部导航栏 - 主页
notifications: 底部导航栏 - 个人中心
SmartCity: 底部导航栏 - 中国智造(根据比赛提供题目来设置)
点击navigation
打开moblie_navigation.xml
运行效果出来了,可是底部导航栏文字没显示全部怎么办?
再次运行看看
创建项目就到这里了。接下来我们开始封装RecyclerView和网络访问,还有Kotlin协程
比赛我所用到的列表都是用RecyclerView来实现的
在smartcity包下新建一个logic包,里面有 model。network。Repository
base: 封装BaseRecyclerAdapter对象
model: 实体类数据
network: ‘网络封装’ 和 ’服务器地址接口对象‘
在base包下新建BaseRecyclerAdapter抽象类对象
看代码注释
abstract class BaseRecyclerAdapter <E, VB: ViewBinding>(
private val list: MutableList<E>,
@LayoutRes
private val layoutId: Int,
) : RecyclerView.Adapter<BaseRecyclerAdapter<E, VB>.ViewHolder>(){
// 填充数据
abstract fun setData(mBinding: VB, data: E, position: Int, holder: ViewHolder)
// 获取布局
abstract fun getInflate(layoutInflater: LayoutInflater, parent: ViewGroup) : VB
override fun onBindViewHolder(holder: ViewHolder, position: Int)
= holder.bindData(list[position], position)
// 列表数量
override fun getItemCount(): Int = list.size
// 布局Id
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder
= ViewHolder(getInflate(LayoutInflater.from(parent.context), parent))
inner class ViewHolder(private val viewBinding: VB) : RecyclerView.ViewHolder(viewBinding.root) {
fun bindData(data: E, position: Int){
setData(viewBinding, data, position, this)
}
}
}
到这里RecyclerView就封装完了。接下来我们封装网络访问Retrofit
在network包下新建NetService
这个对象用于创建Retrofit实例,其中包含一个Http请求的基本URL和Gson转换器。
/**
* 这个对象用于创建Retrofit实例,其中包含一个Http请求的基本URL和Gson转换器。
*/
object NetService {
// Http请求的基本URL
private const val BASE_URL = "服务器地址"
// 创建Retrofit实例
private val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
/**
* 用于创建给定服务类的实例。
*
* @param serviceClass 要创建的服务类。
* @return 给定服务类的实例(使用Retrofit创建)。
*/
fun <E> create(serviceClass: Class<E>) : E = retrofit.create(serviceClass)
/**
* 在不指定服务类的情况下,使用内联函数来创建服务类的实例。
*
* @param R 要创建实例的服务类。
* @return 指定服务类的实例(使用Retrofit创建)。
*/
inline fun <reified R> create() : R = create(R::class.java)
}
接着在network包下新建SmartApi接口对象
/**
* 这个接口定义了一些用于从服务器获取数据的网络请求方法。
*/
interface SmartApi {
/**
* 使用GET请求获取banner数据。
*
* @param map 包含查询参数的Map对象,其中键表示参数名称,值表示参数值。
* @return 与HTTP请求响应对应的BannerModel实例。该方法使用suspend关键字来指示它是一个挂起函数,
* 这意味着在该函数执行期间,调用者协程将被暂停,直到此网络请求完成为止。
*/
@GET("")
suspend fun getBanner(@QueryMap map: Map<String, Int>) : BannerModel
}
挂起函数返回的BannerModel是什么呢?
这个BannerModel是服务器返回Json数据的实体类对象,需要将json返回的数据转换成kotlin数据类
但是比赛提供的插件不支持将Json转换成kotlin的数据类对象,那怎么办呢!
别急,有办法的。我们可以先将服务器返回的Json数据转换成Java实体类对象,再将java实体类对象的代码复制到我们创建好的Kotlin对象里面粘贴,这时候AS工具会提示是否将Java代码转换成Kotlin代码,我们只需要点击ok就可以了。
接下来看我怎么操作吧。
将Json数据转换成Java实体类需要使用插件,刚好比赛时提供将Json数据转换成Java实体类对象的
在AS里面打开Fiel>settings
找到我们存放的插件包路径,点击第一个,然后点击ok就可以了
我们需要重启一下AS
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。