Android学习笔记05

kotlin+mvvm+databinding+recyclerview
上一篇讲了activity跟xml,今天来看看adapter与viewmodel

class Adapter<T>(
    @LayoutRes val resource: Int,
    val listener: Any? = null
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    private val data: List<T>
        get() = _data.toList()
    private val _data: MutableList<T> = mutableListOf()
//这个function有更好的写法,因为我现在这样写若是recyclerview有移动还是会被刷新
    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)
        }

    }
//这边是包在里面的class记得要用inner否则会被预设为外面
    inner class MyViewHolder( var binding: ViewDataBinding):RecyclerView.ViewHolder(binding.root){
        fun setupData(post: Any){
            binding.setVariable(BR.Post, post)
            binding.setVariable(BR.listener, listener)
        }
    }

}

再来是viewmodel

class ViewModel(application: Application): AndroidViewModel(application) , Listener<Post>{

    override fun onClick(post: Post){
        Toast.makeText(getApplication(), post.post, Toast.LENGTH_SHORT).show()
    }

    val data = MutableLiveData<ArrayList<Post>>()
    val listener:Listener<Post>? = this

    fun fetchData(){
        val tempArr = ArrayList<Post>()
        tempArr.add(Post(post = "1"))
        tempArr.add(Post(post = "2"))
        tempArr.add(Post(post = "3"))
        data.value = tempArr

    }
}

这边我简单的做了一笔假资料然後因为我需要getApplication所以要使用AndroidViewModel,他是继承於viewmodel而且可以传application若只使用viewmodel,就无法使用application``


<<:  Ruby on Rails RESTful 网址设计

>>:  Day 2 - 工欲善其事,必先利其器

[DAY 13] ElastiCache

可视为 in memeory DB, 具高效低延迟的特性 AWS ElastiCache 提供托管...

Day19 - 中场休息时间 - 怎麽样用Canvas精准的写出一个『字』 - 成为Canvas Ninja ~ 理解2D渲染的精髓

呃,首先呢~ 敝人小弟在下我今天仔细的思考了一下,决定这次还是再来一篇『中场休息』科普文,等到明天再...

[鼠年全马铁人挑战] Week26 - jQuery 事件处理

event 事件 JavaScript 是个事件驱动 ( Event-driven ) 的语⾔ 浏览...

[Day-15] - Spring 标示说明性注解运用与设计

Abstract 随者Spring各种嗨到爆的注解模式来势汹汹,满足所有开发者配置各类型的元件注解,...

运动控制

运动控制:关键词是“控制理论”; 控制系统可以视为具有四种机能的系统:量测(检测参数)、比较、计算及...