安卓MVVM最簡demo(ViewModel+LiveData+Room+Paging)
簡要介紹
本demo按照MVVM方式實現最簡單的資料展示(支援自動分頁載入)和刪除的demo,用於展示一個完整的MVVM架構.
- 包含:ViewModel+LiveData+Room+Paging
- 語言:Kotlin
- 採用kotlin coroutines實現資料庫操作
- 不包含databinding(對方比較之後,覺得databinding不夠靈活而且還存在一些問題,具體百度搜索.不過demo裡其實也附帶了一個包含databinding的例子)
程式碼實現(只貼出重點程式碼,完整程式碼見原始碼)
- UserActivity
class UserActivity : AppCompatActivity() { private lateinit var viewModel: UserViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_user) val factory = InjectorUtils.provideUserViewModelFactory(this) viewModel = ViewModelProviders.of(this, factory).get(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<User, UserAdapter.ViewHolder>(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<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 } }
- 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
@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.git
安卓開發技術分享: https://www.jianshu.com/p/442339952f26
更多技術總結好文,請關注:「程式園中猿」
