GVKun编程网logo

Kotlin当多个值不工作时,值是一个android视图(kotlin对象)

4

以上就是给各位分享Kotlin当多个值不工作时,值是一个android视图,其中也会对kotlin对象进行解释,同时本文还将给你拓展Android&Kotlin:基于Room、Kotlin协程的MVV

以上就是给各位分享Kotlin当多个值不工作时,值是一个android视图,其中也会对kotlin对象进行解释,同时本文还将给你拓展Android & Kotlin:基于Room、Kotlin协程的MVVM app、android ------ Kotlin+JetPack+MVVM架构实现Wanandroid客户端、android -------- Retrofit + RxJava2.0 + Kotlin + MVP 开发的 WanAndroid 项目、Android Kotlin Anko Realm等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Kotlin当多个值不工作时,值是一个android视图(kotlin对象)

Kotlin当多个值不工作时,值是一个android视图(kotlin对象)

我实现了一个递归地用于anko的apply函数:
fun applyTemplateViewStyles(view: View) {
    when(view) {
        is EditText,TextView -> {
            ....
        }
    }
}

我收到一个错误,说“函数调用’TextView(…)’期望”

因为我可以写一个像0,1这样的子句,为什么我不能用Android视图做同样的事情?

解决方法

你错过了另一个是:
fun applyTemplateViewStyles(view: View) {
    when(view) {
        is EditText,is TextView -> {
            println("view is either EditText or TextView")
        }
        else -> {
            println("view is something else")
        }
    }
}

Android & Kotlin:基于Room、Kotlin协程的MVVM app

Android & Kotlin:基于Room、Kotlin协程的MVVM app

本篇主要介绍Android系统通过Room进行CRUD操作,以及使用kotlin协程的处理方法。

0. 效果展示

在这里插入图片描述

1. 添加依赖

注释使用kapt

apply plugin: ''kotlin-kapt''

1.1 lifecycle

通过这个可以获取其他组建生命周期变化

  • 这里注释使用kapt,选着相应的注释依赖
def lifecycle_version = "2.2.0"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
// 基于kotlin-kapt的注释组建
kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"

1.2 Room

  • Room就好像spring中的jpa,让CRUD更简单
def room_version = "2.2.5"
implementation "androidx.room:room-runtime:$room_version"
 // Kotlin 使用 kapt
kapt "androidx.room:room-compiler:$room_version" 

// optional - Kotlin Extensions and Coroutines support for Room 协程操作库
implementation "androidx.room:room-ktx:$room_version"

1.3 kotlin协程

  • 添加coroutines依赖 以及 android协程依赖
// 添加协程安卓库
implementation ''org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9''
implementation ''org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9''

1.4 数据库表导出

  • 配置在defaultConfig中,将room.schemaLocation导出
javaCompileOptions {
   
   
    annotationProcessorOptions {
   
   
        arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
    }
}

1.5 dataBinding

  • 需要在配置android中激活dataBinding
dataBinding{
   
   
    enabled = true
}

2. 数据表实现

跟spring的配置差不多,model,dao,sersice这些

2.1 创建一个User类

  • User类 对应到user_table
  • @PrimaryKey设置主键先当于spring的@IdautoGenerate = true设置自增
  • @ColumnInfo(name = "user_name")指定列名
/**
 * @author: ffzs
 * @Date: 2020/9/11 下午5:05
 */
@Entity(tableName = "user_table")
data class User (

    @PrimaryKey(autoGenerate = true)
    var id:Long,
    @ColumnInfo(name = "user_name")
    var name:String,
    @ColumnInfo(name = "email")
    var email:String
)

2.2 dao实现

  • @Dao进行注释
  • @Query写法跟jpa基本相同
/**
 * @author: ffzs
 * @Date: 2020/9/11 下午5:08
 */

@Dao
interface UserDao {
   
   

    @Insert
    suspend fun insert (user: User):Long

    @Update
    suspend fun update (user: User):Int

    @Delete
    suspend fun delete (user: User):Int

    @Query("DELETE FROM user_table")
    suspend fun deleteAll ():Int

    @Query("SELECT * FROM user_table")
    fun findAll ():LiveData<List<User>>

    @Query("SELECT * FROM user_table WHERE id = :id")
    suspend fun findById (id:Long):User

}

2.3 服务实现

  • 主要用来获取数据
class UserRepository(private val dao: UserDao) {
   
   

    val subscribers = dao.findAll()

    suspend fun insert(user: User):Long{
   
   
        return dao.insert(user)
    }

    suspend fun update(user: User):Int{
   
   
        return dao.update(user)
    }

    suspend fun delete(user: User) : Int{
   
   
        return dao.delete(user)
    }

    suspend fun deleteAll() : Int{
   
   
        return dao.deleteAll()
    }
}

2.4 RoomDatabase实现

  • 通过伴生对象实现单例模式
  • entities = [User::class],需要实现表的类,通过反射生成数据表
/**
 * @author: ffzs
 * @Date: 2020/9/11 下午5:15
 */
@Database(entities = [User::class], version = 1)
abstract class UserDatabase : RoomDatabase() {
   
   

    abstract val userDao: UserDao

    // 通过伴生对象实现单例模式
    companion object {
   
   
        @Volatile
        private var INSTANCE: UserDatabase? = null
        fun getInstance(context: Context): UserDatabase {
   
   
            synchronized(this) {
   
   
                var instance = INSTANCE
                if (instance == null) {
   
   
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        UserDatabase::class.java,
                        "user_table"
                    ).build()
                }
                return instance
            }
        }
    }
}
  • 直接通过getInstance方法获取database实例:
UserDatabase.getInstance(application)

3. databinding实现

3.1 实现ViewModel

  • 首先需要实现一个ViewModel,用来绑定参数
/**
 * @author: ffzs
 * @Date: 2020/9/11 下午4:46
 */
class UserViewModel (private val repository: UserRepository): ViewModel(), Observable {
   
   
    @Bindable
    val inputName = MutableLiveData<String>()
    @Bindable
    val inputEmail = MutableLiveData<String>()
    @Bindable
    val btnSave = MutableLiveData<String>()
    @Bindable
    val btnDel = MutableLiveData<String>()

3.2 activity_main绑定

  • 通过layout进行绑定,使用variable进行配置

在这里插入图片描述

3.3 关联使用

  • 变量关联

在这里插入图片描述

  • 函数关联,像极了前端的回调
    在这里插入图片描述

3.4 绑定

  • 通过下图的方法可以进行绑定,如图所示这里还少一个factory
    在这里插入图片描述

3.5 ViewModelProvider.Factory

/**
 * @author: ffzs
 * @Date: 2020/9/11 下午6:43
 */
class UserViewModelFactory (private val repository: UserRepository): ViewModelProvider.Factory {
   
   

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
   
   
        if(modelClass.isAssignableFrom(UserViewModel::class.java)){
   
   
            return UserViewModel(repository) as T
        }
        throw IllegalArgumentException("ViewModel类型不匹配")
    }
}

3.6 设置生命周期的归属

  • 指定binding的归属
binding.lifecycleOwner = this

3.7 完整绑定代码

val dao = UserDatabase.getInstance(application).userDao
val repository = UserRepository(dao)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
userViewModel = ViewModelProvider(this,UserViewModelFactory(repository)).get(UserViewModel::class.java)
binding.userViewModel = userViewModel

4. RecyclerView实现用户展示

4.1 Holder实现

  • 将传入的user信息通过binding写到RecyclerView
  • 以及点击触发效果
/**
 * @author: ffzs
 * @Date: 2020/9/11 下午7:12
 */
class UserViewHolder (val binding: UserListBinding): RecyclerView.ViewHolder(binding.root){
   
   

    fun bind(user: User, clickListener:(User)->Unit){
   
   
        binding.nameTextView.text = user.name
        binding.emailTextView.text = user.email
        binding.listItemLayout.setOnClickListener{
   
   
            clickListener(user)
        }
    }
}

4.2 Adapter实现

用来实现RecyclerView状态的更改

  • 通过binding生成holder
  • onBindViewHolder操作当前位置元素,并执行操作
  • getItemCount返回展示数量
/**
 * @author: ffzs
 * @Date: 2020/9/11 下午7:11
 */
class UserRecyclerViewAdapter(private val clickListener: (User) -> Unit) : RecyclerView.Adapter<UserViewHolder>() {
   
   
    
    private val userList = ArrayList<User>()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
   
   
        val layoutInflater = LayoutInflater.from(parent.context)
        val binding : UserListBinding =
            DataBindingUtil.inflate(layoutInflater,R.layout.user_list,parent,false)
        return UserViewHolder(binding)
    }

    override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
   
   
        holder.bind(userList[position], clickListener)
    }

    override fun getItemCount(): Int {
   
   
        return userList.size
    }

    fun setList(users: List<User>){
   
   
        userList.clear()
        userList.addAll(users)
    }
}

5. 协程使用

  • insert协程写法,直接通过viewModelScope调用协程launch,在代码块中进行操作
  • 感觉跟使用reactor有些相似,主要避免阻塞,dao中使用suspend标注异步
private fun insert(subscriber: User) = viewModelScope.launch {
   
   
    val newRowId = repository.insert(subscriber)
    if (newRowId > -1) {
   
   
        msg.value = Event("$newRowId 成功添加")
    } else {
   
   
        msg.value = Event("添加出错")
    }
}

6. debug

6.1 databinding载入失败

在这里插入图片描述

配置中需要enable

dataBinding{
   
   
    enabled = true
}

6.2 javax/xml/bind/JAXBException

  • java8以上不自带xml bind下图中位置改成java8
  • java11写spring还可以,看来写java还有点早
    在这里插入图片描述

7. 源码

github

android ------ Kotlin+JetPack+MVVM架构实现Wanandroid客户端

android ------ Kotlin+JetPack+MVVM架构实现Wanandroid客户端

前面简单介绍了JetPack简介,然后学习了这个项目,现在来分享一下助你更快的学习JetPack

是一个基于MVVM模式集成谷歌官方推荐的JetPack组件库:
LiveData、ViewModel、Lifecycle、Navigation组件
使用kotlin语言,添加大量拓展函数,简化代码加入Retrofit网络请求,协程,帮你简化各种操作,让你快速请求网络

利用Navigation组件以单Activity+Fragment架构编写的项目

效果图展示
在这里插入图片描述
如何集成使用
在 根目录下build.gradle中加入Jitpack仓库

allprojects {
    repositories {
        ...
        maven { url ''https://jitpack.io'' }
    }
}

在app下 build.gradle中添加依赖

dependencies {
  ...
  implementation ''me.hegj:JetpackMvvm:1.1.9''
}

在app’下build.gradle中,android 模块下开启DataBinding

android {
    ...
    dataBinding {
        enabled = true 
    }
}

这样就可以开始使用了,项目中使用了大部分的技术,可以慢慢参考学习

项目apk下载
在这里插入图片描述

源码下载:https://github.com/hegaojian/JetpackMvvm

 

android -------- Retrofit + RxJava2.0 + Kotlin + MVP 开发的 WanAndroid 项目

android -------- Retrofit + RxJava2.0 + Kotlin + MVP 开发的 WanAndroid 项目

简介

wanandroid项目基于 Retrofit + RxJava2.0 + Kotlin + MVP

 

用到的依赖

implementation ''io.reactivex.rxjava2:rxjava:2.1.3''
    implementation ''com.squareup.retrofit2:retrofit:2.3.0''
    implementation ''com.squareup.retrofit2:converter-gson:2.3.0''
    implementation ''com.squareup.retrofit2:adapter-rxjava2:2.3.0''
    implementation ''io.reactivex.rxjava2:rxandroid:2.0.1''
    implementation ''com.github.bumptech.glide:glide:3.7.0''

    implementation ''cn.bingoogolapple:bga-banner:2.2.4''
    implementation ''com.just.agentweb:agentweb:1.0.3''

    /** loading状态组件 **/
    implementation ''com.github.ybq:Android-SpinKit:1.1.0''

    /**状态栏**/
    implementation ''com.gyf.barlibrary:barlibrary:2.3.0''

    implementation ''com.hyman:flowlayout-lib:1.1.2''

    implementation ''com.alibaba:fastjson:1.1.68.android''

还有下拉刷新 SmartRefreshLayout

 

效果图      

 

 

 

       

 

 

玩Android的Api是免费的,感谢WanAndroid提供的数据来源

鸿洋大佬提供的API 接口 http://www.wanandroid.com/blog/show/2

 

项目地址: https://github.com/DickyQie/wanandroid

 

Android Kotlin Anko Realm

Android Kotlin Anko Realm

https://realm.io/cn/news/getting-started-with-kotlin-and-anko/

如何评价 Kotlin 语言?

https://www.zhihu.com/question/25289041

Kotlin 的视频教程:

https://zhuanlan.zhihu.com/p/23101437

今天关于Kotlin当多个值不工作时,值是一个android视图kotlin对象的分享就到这里,希望大家有所收获,若想了解更多关于Android & Kotlin:基于Room、Kotlin协程的MVVM app、android ------ Kotlin+JetPack+MVVM架构实现Wanandroid客户端、android -------- Retrofit + RxJava2.0 + Kotlin + MVP 开发的 WanAndroid 项目、Android Kotlin Anko Realm等相关知识,可以在本站进行查询。

本文标签: