简要介绍

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


包含:ViewModel+LiveData+Room+Paging语言:Kotlin采用kotlin coroutines实现数据库操作包含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<User, UserAdapter.ViewHolder>(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<User>() {
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
@Dao
interface UserDao {
@Query("SELECT * FROM User")
fun getUserList(): DataSource.Factory<Int, User>

@Insert
fun add(user: User)

@Insert
fun add(users: List<User>)

@Delete
fun del(user:User)
}

Demo源代码

https://gitee.com/cxyzy1/mvvmDemo/tree/master/app_paging_databinding

点击关注专栏,查看最新技术分享

更多技术总结好文,请关注:「程序园中猿」

安卓Jetpack版MVVM最简demo(ViewModel+LiveData+Room+Paging+DataBinding+RecyclerView)_git安卓Jetpack版MVVM最简demo(ViewModel+LiveData+Room+Paging+DataBinding+RecyclerView)_ide_02