網站首頁 編程語言 正文
Android Jetpack之ViewModel、LiveData
Android Jetpack之LifeCycle
一、官方推薦的Jetpack架構
ViewModel是介于View(視圖)和Model(數據模型)之間的中間層,能夠使視圖和數據分離,又能提供視圖和數據之間的通信。
LiveData是一個能夠在ViewModel中數據發生變化時通知頁面刷新UI線程的組件庫。
Room是在SQLLite上提供了一層封裝。(Android采用SQLLite作為數據庫存儲)
二、添加依賴
? ? implementation "androidx.activity:activity-ktx:1.2.0"
? ? implementation "androidx.fragment:fragment-ktx:1.3.0"
下面的案例,只是簡潔的代碼片段,大致介紹一下,讓大家了解這個架構。具體詳細代碼及深度原理,請大家自行查閱其他深度講解文章。
三、創建Repository
StudentRepository
class StudentRepository { var studentDao: StudentDao? = null constructor(context: Context) { val database = MyDatabase.getInstance(context) studentDao = database!!.getStudentDao() } //LiveData集合 fun getAllStudentsLive(): LiveData<List<Student>> { return studentDao!!.getAllStudentsLive() } fun deleteAllStudents() { studentDao!!.deleteAllStudents() } fun queryAll(): List<Student>? { return studentDao!!.queryAll() } fun insertStudent(vararg student: Student?) { studentDao!!.insertStudent(*student) } fun deleteStudent(vararg student: Student) { studentDao!!.deleteStudent(*student) } fun updateStudent(vararg student: Student) { studentDao!!.updateStudent(*student) } }
StudentDao
@Dao interface StudentDao { @Insert fun insertStudent(vararg students: Student?) @Delete fun deleteStudent(vararg students: Student?) @Update fun updateStudent(vararg students: Student?) @Query("SELECT * FROM student") fun getAllStudent(): List<Student?>? @Query("SELECT * FROM student WHERE id = :id") fun getStudentById(id: Int): List<Student?>? }
Repository
類中是關于Dao的操作,getAllStudentsLive()
方法返回的是一個LiveData集合。
四、創建ViewModel
StudentViewModel
class StudentViewModel(application: Application) : AndroidViewModel(application) { //初始化Repository對象 private val repository by lazy { StudentRepository(application) } //定義LiveData集合 private var liveDataStudent: LiveData<List<Student>>? = null init { liveDataStudent = repository.getAllStudentsLive() } fun getAllStudentsLive(): LiveData<List<Student>>? { viewModelScope.launch(Dispatchers.Default) { liveDataStudent = repository.getAllStudentsLive() } return liveDataStudent } private fun insertStudent(vararg student: Student) { viewModelScope.launch(Dispatchers.Default) { repository.insertStudent(*student) } } private fun deleteStudent(vararg student: Student) { viewModelScope.launch(Dispatchers.Default) { repository.deleteStudent(*student) } } private fun updateStudent(vararg student: Student) { viewModelScope.launch(Dispatchers.Default) { repository.updateStudent(*student) } } private fun deleteAllStudents() { viewModelScope.launch(Dispatchers.Default) { repository.deleteAllStudents() } } //以下為DataBinding布局調用的方法------------------- fun mInsert() { val s1 = Student("zhangsan", 26) val s2 = Student("lisi", 18) insertStudent(s1, s2) } fun mClear() { deleteAllStudents() } fun mDelete() { var s1 = Student(3) deleteStudent(s1) } fun mUpdate() { val s1 = Student(2, "wanger", 21) updateStudent(s1) } }
初始化數據庫Repository,創建一個livedata集合的屬性,并提供對其操作的方法。
五、activity中使用
mainActivity
class MainActivity : AppCompatActivity() { private var adapter: StudentRecyclerViewAdapter? = null private var listStudent: ArrayList<Student> = ArrayList() private var viewModel: StudentViewModel? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //databinding val binding = DataBindingUtil. setContentView<ActivityMainBinding>(this, R.layout.activity_main) //viewmodel viewModel = ViewModelProvider(this)[StudentViewModel::class.java] binding.studentViewModel = viewModel binding.lifecycleOwner = this binding.recycleView.layoutManager = LinearLayoutManager(this) adapter = StudentRecyclerViewAdapter(listStudent) binding.recycleView.adapter = adapter //livedata、room viewModel!!.getAllStudentsLive()!!. observe(this,androidx.lifecycle.Observer { adapter!!.students = it adapter!!.notifyDataSetChanged() }) } }
上面案例中,通過ActivityMainBinding獲取對應控件,添加對應的邏輯,其次使用getAllStudentsLive
方法獲取到對應的LiveData,并通過observe
監聽LiveData集合。
原文鏈接:https://blog.csdn.net/csdn_aiyang/article/details/126832972
相關推薦
- 2023-04-28 react如何獲取URL中參數_React
- 2022-08-10 淺談Redis變慢的原因及排查方法_Redis
- 2022-07-19 Python數據分析之?Pandas?Dataframe合并和去重操作_python
- 2022-07-01 C語言詳細講解strcpy?strcat?strcmp函數的模擬實現_C 語言
- 2022-11-03 C#事件中的兩個參數詳解(object?sender,EventArgs?e)_C#教程
- 2023-10-15 centos7 虛擬機中,網卡不啟動的解決方式
- 2022-12-01 .NET?Core部署為Windows服務的詳細步驟_實用技巧
- 2022-10-30 淺析pytest?鉤子函數?之初始鉤子和引導鉤子_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支