Android学习笔记06

kotlin+mvvm+databinding+recyclerview
今天在跟朋友讨论程序码的时候,他点出我用databing是可以不需要listener的,我稍微修改了一些前两天的程序码,也把前两天的code整合起来
在结合code之前,我实作了一个viewmodelFactor,是用扩展的方式实作

class ViewModelFactory(application: Application) : ViewModelProvider.AndroidViewModelFactory(application)

fun <T : ViewModel> ViewModelStoreOwner.initViewModel(application: Application, viewModel: Class<T>): T = ViewModelProvider(this,
    ViewModelFactory(application = application)).get(viewModel) 

这边要继承AndroidViewModel因为可以引入application
再来是修改过後的activity,adapter,viewmodel
首先是activity

class Activity:AppCompatActivity() {
    lateinit var binding: ActivityMainBinding

    private val mViewModel by lazy {
        initViewModel(application, ViewModel::class.java)
    }

    private val mAdapter by lazy {
        Adapter<Post>(R.layout.item_view,mViewModel)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.recyclerView.adapter = mAdapter

        mViewModel.data.observe(this, Observer { post ->
            mAdapter.updateData(post)
        })
        mViewModel.fetchData()
    }
}

adapter

class Adapter<T>(
    @LayoutRes val resource: Int,
    val viewmodel:ViewModel
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    private val data: List<T>
        get() = _data.toList()
    private val _data: MutableList<T> = mutableListOf()

    fun updateData(list: ArrayList<T>){
        _data.clear()
        _data.addAll(list)
        notifyDataSetChanged()
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val layoutInflater = LayoutInflater.from(parent.context)
        val binding = DataBindingUtil.inflate<ViewDataBinding>(layoutInflater, resource, parent,false)
        return MyViewHolder(binding)
    }

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

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        if (holder is Adapter<*>.MyViewHolder){
            val item = data[position]
            if (item != null)
                holder.setupData(item)
        }

    }

    inner class MyViewHolder( var binding: ViewDataBinding):RecyclerView.ViewHolder(binding.root){
        fun setupData(post: Any){
            binding.setVariable(BR.Post, post)
            binding.setVariable(BR.viewmodel,viewmodel)
        }
    }

}

viewmodel

![https://ithelp.ithome.com.tw/upload/images/20210915/20141791zjHci8JfER.jpg](https://ithelp.ithome.com.tw/upload/images/20210915/20141791zjHci8JfER.jpg)```

<<:  【设计+切版30天实作】|Day1 - 开赛宣言

>>:  用程序码画个1/4圆的按钮

[Day6] Face Detection - 使用Google ML Kit (iOS)

昨天是使用Android平台来作开发,当然不可少iOS平台罗! 有人给你了apk(Android),...

Day28-结合全部所学-前端实作篇

前言 终於把这次系列文需要先学会的观念都介绍完了,接下来就要进入实作环节的重头戏,前面讲了那麽多的观...

JS 02 - 资料型别

大家好! 昨天的小测验,有没有全部答对呢? 我们进入今天的主题吧! 建立资料 昨天我们提到的 字面建...

[Day1] 时间序列分析:时间序列资料属性拆解

欢迎来到【时间序列分析与预测方法大全】第一篇! 本篇我们会介绍时间序列资料所包含的属性。 先对资料特...

Day 20 云端虚拟桌面

在资讯化管理上,越来越多企业会选择使用透过集中化管理的方式,除了让资料尽可能让员工无法外流等资安考...