将原生android项目转换为kotlin时遇到的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21700489/article/details/79174293

代码重构过程遇到的问题

  1. 对于Fragment,只有在onCreateView方法执行完毕后才能直接通过id引用布局文件中的控件

  2. 同时使用DataBinding框架和Kotlin导致的错误【解决方案链接】

    Error:(x, x) Unresolved reference: databinding
    
  3. 定制Glide的全局加载配置时,需要创建一个类继承AppGlideModule。然后使用GlideApp而不是Glide去加载图片。我在某个Kotlin文件中同时使用了Glide框架后,当MakeProject时,报错:找不到GlideApp。也就是编译时没有生成该类。解决方法,修改build.gradle文件【解决方案链接】

    implementation 'com.github.bumptech.glide:glide:4.4.0'
    kapt 'com.github.bumptech.glide:compiler:4.4.0'
  4. 在Java代码和Kotlin代码中混合使用ButteeKnife框架时,建议修改build.gradle文件中ButterKnife的注释生成器

    implementation 'com.jakewharton:butterknife:8.8.1'
    kapt 'com.jakewharton:butterknife-compiler:8.8.1'
  5. kotlin+Lamada+RxJava的一些代码精简过程

    //原始版本
    .subscribe(object : Subscriber<ZhihuThemeList>() {
       override fun onNext(t: ZhihuThemeList?) {}
       override fun onCompleted(){}
       override fun onError(e: Throwable?) {}
    })
    
    //精简版 +
    .subscribe(object : Action1<ZhihuThemeList>{
      override fun call(t:ZhihuThemeList?){}
    })
    
    //精简版 ++  (匿名内部类或者接口只有一个待实现的方法,可使用Lambda表达式)
    .subscribe{  data -> mAdapter?.setmDataSet(data)  }
    
    //精简版 +++ (如果无需重命名唯一待实现的方法的参数(参数只有一个),可省略参数声明直接用it表示)
    .subscribe {  mAdapter?.setmDataSet(it) }
    
  6. RecycleView中Databinding+Kotlin的具体应用

    ①首先写一个通用的工具类Util.kt
import android.databinding.DataBindingUtil
import android.databinding.ViewDataBinding
import android.support.annotation.LayoutRes
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

/**
 * 通用的ViewHolder类,由于使用了DataBinding框架所以无需使用ButterKnife框架进行@BindView的声明
 */
class CommonViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)


/**
 * 返回ViewHolder的简便的拓展方法
 */
fun <T : ViewDataBinding> ViewGroup.inflate(@LayoutRes layoutRes: Int, attachToParent: Boolean = false): CommonViewHolder {
    return CommonViewHolder(DataBindingUtil.inflate<T>(LayoutInflater.from(context), layoutRes, this, attachToParent).root)
}
②在其它自定义的RecycleViewAdapter中的应用

class MenuAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    companion object {
        private val TYPE_TOP = 0
        private val TYPE_NOT_TOP = 1
    }
    ... //省略一部分代码
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
            when (viewType) {
                TYPE_TOP -> parent.inflate<TopItemMenuRecycleviewBinding>(R.layout.top_item_menu_recycleview)
                else -> parent.inflate<ItemLeftMenuRecycleviewBinding>(R.layout.item_left_menu_recycleview)
            }

}

猜你喜欢

转载自blog.csdn.net/qq_21700489/article/details/79174293
今日推荐