安卓Jetpack版MVVM最简demo(ViewModel+LiveData+Room+Paging+DataBinding+RecyclerView)
发布日期:2021-06-29 18:33:25 浏览次数:3 分类:技术文章

本文共 3517 字,大约阅读时间需要 11 分钟。

简要介绍

本demo按照MVVM方式实现最简单的数据展示(支持自动分页加载)和删除的demo,用于展示一个完整的MVVM架构.

  1. 包含:ViewModel+LiveData+Room+Paging
  2. 语言:Kotlin
  3. 包含databinding

代码实现(只贴出重点代码,完整代码见源代码)

  1. 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) })    }}
  1. 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 }}
  1. UserViewModel
class UserViewModel internal constructor(private val userRepository: UserRepository) : ViewModel() {    val userList = userRepository.getUserList()    fun delUser(id: Int) {        GlobalScope.launch {            userRepository.delUser(id)        }    }}
  1. 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 }                }    }}
  1. 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:安卓多渠道打包
下一篇:安卓Jetpack版MVVM最简demo(ViewModel+LiveData+Room+Paging+RecyclerView)

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月14日 22时57分54秒