Android Jetpack組件支持庫(kù)DataBinding與ViewModel與LiveData及Room詳解
Android Jetpack之ViewModel、LiveData
一、官方推薦的Jetpack架構(gòu)
ViewModel是介于View(視圖)和Model(數(shù)據(jù)模型)之間的中間層,能夠使視圖和數(shù)據(jù)分離,又能提供視圖和數(shù)據(jù)之間的通信。
LiveData是一個(gè)能夠在ViewModel中數(shù)據(jù)發(fā)生變化時(shí)通知頁(yè)面刷新UI線程的組件庫(kù)。
Room是在SQLLite上提供了一層封裝。(Android采用SQLLite作為數(shù)據(jù)庫(kù)存儲(chǔ))
二、添加依賴
implementation "androidx.activity:activity-ktx:1.2.0"
implementation "androidx.fragment:fragment-ktx:1.3.0"
下面的案例,只是簡(jiǎn)潔的代碼片段,大致介紹一下,讓大家了解這個(gè)架構(gòu)。具體詳細(xì)代碼及深度原理,請(qǐng)大家自行查閱其他深度講解文章。
三、創(chuàng)建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
類中是關(guān)于Dao的操作,getAllStudentsLive()
方法返回的是一個(gè)LiveData集合。
四、創(chuàng)建ViewModel
StudentViewModel
class StudentViewModel(application: Application) : AndroidViewModel(application) { //初始化Repository對(duì)象 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布局調(diào)用的方法------------------- 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) } }
初始化數(shù)據(jù)庫(kù)Repository,創(chuàng)建一個(gè)livedata集合的屬性,并提供對(duì)其操作的方法。
五、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() }) } }
上面案例中,通過(guò)ActivityMainBinding獲取對(duì)應(yīng)控件,添加對(duì)應(yīng)的邏輯,其次使用getAllStudentsLive
方法獲取到對(duì)應(yīng)的LiveData,并通過(guò)observe
監(jiān)聽(tīng)LiveData集合。
到此這篇關(guān)于Android Jetpack組件支持庫(kù)DataBinding與ViewModel與LiveData及Room詳解的文章就介紹到這了,更多相關(guān)Android Jetpack組件支持庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android自定義wheelview隨機(jī)選號(hào)效果
這篇文章主要介紹了Android自定義wheelview隨機(jī)選號(hào)效果,利用wheelview實(shí)現(xiàn)滾動(dòng)隨機(jī)選擇號(hào)碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Android 兩個(gè)Service的相互監(jiān)視實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 兩個(gè)Service的相互監(jiān)視實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10Android基于ViewDragHelper仿QQ5.0側(cè)滑界面效果
這篇文章主要介紹了Android基于ViewDragHelper仿QQ5.0側(cè)滑界面效果,具有一定的,感興趣的小伙伴們可以參考一下2016-07-07android藍(lán)牙簡(jiǎn)單開(kāi)發(fā)示例教程
大家好,本篇文章主要講的是android藍(lán)牙簡(jiǎn)單開(kāi)發(fā)示例教程,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2021-12-12詳解Android首選項(xiàng)框架的使用實(shí)例
首選項(xiàng)這個(gè)名詞對(duì)于熟悉Android的朋友們一定不會(huì)感到陌生,它經(jīng)常用來(lái)設(shè)置軟件的運(yùn)行參數(shù)。本篇文章主要介紹詳解Android首選項(xiàng)框架的使用實(shí)例,有興趣的可以了解一下。2016-11-11flutter實(shí)現(xiàn)掃碼槍獲取數(shù)據(jù)源禁止系統(tǒng)鍵盤(pán)彈窗示例詳解
這篇文章主要為大家介紹了flutter實(shí)現(xiàn)掃碼槍獲取數(shù)據(jù)源禁止系統(tǒng)鍵盤(pán)彈窗示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Android編程實(shí)現(xiàn)EditText字?jǐn)?shù)監(jiān)聽(tīng)并顯示的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)EditText字?jǐn)?shù)監(jiān)聽(tīng)并顯示的方法,涉及Android EditText文本框事件監(jiān)聽(tīng)與響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下2017-02-02