安卓Jetpack版MVVM最简demo(ViewModel+LiveData+Room+Paging+DataBinding+RecyclerView)
发布日期:2021-06-29 18:33:25
浏览次数:3
分类:技术文章
本文共 3517 字,大约阅读时间需要 11 分钟。
简要介绍
本demo按照MVVM方式实现最简单的数据展示(支持自动分页加载)和删除的demo,用于展示一个完整的MVVM架构.
- 包含:ViewModel+LiveData+Room+Paging
- 语言:Kotlin
- 包含databinding
代码实现(只贴出重点代码,完整代码见源代码)
- UserActivity
class UserActivity : AppCompatActivity() { private lateinit var viewModel: UserViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding: ActivityUserBinding = DataBindingUtil.setContentView(this, R.layout.activity_user) val factory = InjectorUtils.provideUserViewModelFactory(this) viewModel = ViewModelProviders.of(this, factory).get(UserViewModel::class.java) val adapter = UserAdapter() adapter.listener = View.OnClickListener { view -> view?.let { val user = view.tag as User viewModel.delUser(user.id) } } binding.userRv.adapter = adapter viewModel.userList.observe(this, Observer { adapter.submitList(it) }) }}
- UserAdapter
class UserAdapter : PagedListAdapter(UserDiffCallback()) { lateinit var listener: View.OnClickListener override fun onBindViewHolder(holder: ViewHolder, position: Int) { val data = getItem(position) ?: return holder.apply { bind(listener, data) itemView.tag = data } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { return ViewHolder(ItemUserBinding.inflate( LayoutInflater.from(parent.context), parent, false)) } class ViewHolder( private val binding: ItemUserBinding ) : RecyclerView.ViewHolder(binding.root) { fun bind(listener: View.OnClickListener, item: User) { binding.apply { clickListener = listener user = item executePendingBindings() } } }}private class UserDiffCallback : DiffUtil.ItemCallback () { override fun areContentsTheSame(oldItem: User, newItem: User): Boolean { return oldItem.id == newItem.id } override fun areItemsTheSame(oldItem: User, newItem: User): Boolean { return oldItem == newItem }}
- UserViewModel
class UserViewModel internal constructor(private val userRepository: UserRepository) : ViewModel() { val userList = userRepository.getUserList() fun delUser(id: Int) { GlobalScope.launch { userRepository.delUser(id) } }}
- UserRepository
class UserRepository private constructor(private val userDao: UserDao) { fun getUserList() = userDao.getUserList().toLiveData(Config( pageSize = 30, enablePlaceholders = true)) suspend fun addUser(name: String) { withContext(Dispatchers.IO) { val user = User(0, name) userDao.add(user) } } suspend fun delUser(id: Int) { withContext(Dispatchers.IO) { val user = User(id, "") userDao.del(user) } } companion object { @Volatile private var instance: UserRepository? = null fun getInstance(userDao: UserDao) = instance ?: synchronized(this) { instance ?: UserRepository(userDao).also { instance = it } } }}
- UserDao
@Daointerface UserDao { @Query("SELECT * FROM User") fun getUserList(): DataSource.Factory@Insert fun add(user: User) @Insert fun add(users: List ) @Delete fun del(user:User)}
Demo源代码
安卓开发技术分享:
更多技术总结好文,请关注:「程序园中猿」转载地址:https://cxyxy.blog.csdn.net/article/details/88785782 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年04月14日 22时57分54秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
博客43周热门文章
2019-04-30
2019-10-27 博客热门文章
2019-04-30
学习笔记(1):视觉应用工程师-环境安装教学视频-Mac系统其他操作
2019-04-30
Java 学习到什么程度可以找第一份工作?
2019-04-30
Python 学习资源
2019-04-30
2021-06-08日互联网热点
2019-04-30
使用Python编写Hive UDF
2019-04-30
人工智能面试实战题
2019-04-30
使用hxcomp.exe反编译MSDN文档
2019-04-30
使用Zoundry在CSDN发布Blog
2019-04-30
CSDN下载频道上传资源时增加了进度条
2019-04-30
PHP中simplexml对象不能被序列化
2019-04-30
程序员拥有自己的代码空间啦!(转)
2019-04-30
CSDN iCode ToDoList
2019-04-30
今天下载频道的Apache故障的解决
2019-04-30
用mysqldumpslow分析mysql的slow query log
2019-04-30
将memcache静态编译入 PHP
2019-04-30
惊奇发现Sina搜索改用Google了
2019-04-30
快快修改您的头像,凸显您的个性
2019-04-30
分析网页得到链接
2019-04-30