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)```
昨天是使用Android平台来作开发,当然不可少iOS平台罗! 有人给你了apk(Android),...
前言 终於把这次系列文需要先学会的观念都介绍完了,接下来就要进入实作环节的重头戏,前面讲了那麽多的观...
大家好! 昨天的小测验,有没有全部答对呢? 我们进入今天的主题吧! 建立资料 昨天我们提到的 字面建...
欢迎来到【时间序列分析与预测方法大全】第一篇! 本篇我们会介绍时间序列资料所包含的属性。 先对资料特...
在资讯化管理上,越来越多企业会选择使用透过集中化管理的方式,除了让资料尽可能让员工无法外流等资安考...