安卓Jetpack版MVVM最简demo(ViewModel+LiveData+Room+Paging+RecyclerView)
发布日期:2021-06-29 18:33:25
浏览次数:2
分类:技术文章
本文共 3163 字,大约阅读时间需要 10 分钟。
简要介绍
本demo按照MVVM方式实现最简单的数据展示(支持自动分页加载)和删除的demo,用于展示一个完整的MVVM架构.
- 包含:ViewModel+LiveData+Room+Paging
- 语言:Kotlin
- 不包含databinding(对方比较之后,觉得databinding不够灵活而且还存在一些问题,具体百度搜索.不过demo里其实也附带了一个包含databinding的例子)
代码实现(只贴出重点代码,完整代码见源代码)
- UserActivity
class UserActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_user) val viewModel = obtainViewModel(UserViewModel::class.java) val adapter = UserAdapter() adapter.setOnItemClick { user -> viewModel.delUser(user.id) } userRv.adapter = adapter viewModel.userList.observe(this, Observer { adapter.submitList(it) }) }}
- UserAdapter
class UserAdapter : PagedListAdapter(UserDiffCallback()) { private lateinit var onItemClick: (user: User) -> Unit override fun onBindViewHolder(holder: ViewHolder, position: Int) { val data = getItem(position) ?: return holder.itemView.userTv.text = data.name holder.itemView.setOnClickListener { onItemClick(data) } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_user, parent, false) return ViewHolder(view) } infix fun setOnItemClick(onClick: (user: User) -> Unit) { this.onItemClick = onClick } class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView!!)}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/88784081 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月20日 08时40分51秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
OpenCV的cvLoadImage函数
2019-04-29
OpenCV中与matlab中相对应的函数
2019-04-29
C/C++中二维数组作函数形参时,调用函数时,可传递的实参类型的小结
2019-04-29
cvGetSubRect与cvMul用法
2019-04-29
opencv图像处理梯度边缘和角点
2019-04-29
Caffe源码中blob文件分析
2019-04-29
OpenCV 图像采样 插值 几何变换
2019-04-29
图像处理-仿射变换 AffineTransform
2019-04-29
图像二值化----otsu(最大类间方差法、大津算法)
2019-04-29
图像二值化----otsu(最大类间方差法、大津算法)(二)
2019-04-29
OpenCV编程案例:使用轮廓函数检测连通区域
2019-04-29
opencv使用cvFindContours提取联通域
2019-04-29
C++中MessageBox的常见用法
2019-04-29
ordfilt2函数功能说明
2019-04-29
在图像变换中用最小二乘法求解仿射变换参数
2019-04-29
软件包应用分享|基于RT-Thread的百度语音识别(一)
2019-04-29
12月8日 RCEA - RT-Thread能力认证考试考前通知
2019-04-29
论坛热贴 | RT-Thread音频驱动开发(一)
2019-04-29
基于 Keil MDK 移植 RT-Thread Nano
2019-04-29
【报名截至今晚】12月14日深圳嵌入式与音频开发专题会议预告
2019-04-29