Android Jetpack組件支持庫DataBinding與ViewModel與LiveData及Room詳解
Android Jetpack之ViewModel、LiveData

一、官方推薦的Jetpack架構(gòu)

ViewModel是介于View(視圖)和Model(數(shù)據(jù)模型)之間的中間層,能夠使視圖和數(shù)據(jù)分離,又能提供視圖和數(shù)據(jù)之間的通信。
LiveData是一個能夠在ViewModel中數(shù)據(jù)發(fā)生變化時通知頁面刷新UI線程的組件庫。
Room是在SQLLite上提供了一層封裝。(Android采用SQLLite作為數(shù)據(jù)庫存儲)
二、添加依賴
implementation "androidx.activity:activity-ktx:1.2.0"
implementation "androidx.fragment:fragment-ktx:1.3.0"
下面的案例,只是簡潔的代碼片段,大致介紹一下,讓大家了解這個架構(gòu)。具體詳細代碼及深度原理,請大家自行查閱其他深度講解文章。
三、創(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()方法返回的是一個LiveData集合。
四、創(chuàng)建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布局調(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ù)庫Repository,創(chuàng)建一個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獲取對應(yīng)控件,添加對應(yīng)的邏輯,其次使用getAllStudentsLive方法獲取到對應(yīng)的LiveData,并通過observe監(jiān)聽LiveData集合。
到此這篇關(guān)于Android Jetpack組件支持庫DataBinding與ViewModel與LiveData及Room詳解的文章就介紹到這了,更多相關(guān)Android Jetpack組件支持庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 兩個Service的相互監(jiān)視實現(xiàn)代碼
這篇文章主要介紹了Android 兩個Service的相互監(jiān)視實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10
Android基于ViewDragHelper仿QQ5.0側(cè)滑界面效果
這篇文章主要介紹了Android基于ViewDragHelper仿QQ5.0側(cè)滑界面效果,具有一定的,感興趣的小伙伴們可以參考一下2016-07-07
flutter實現(xiàn)掃碼槍獲取數(shù)據(jù)源禁止系統(tǒng)鍵盤彈窗示例詳解
這篇文章主要為大家介紹了flutter實現(xiàn)掃碼槍獲取數(shù)據(jù)源禁止系統(tǒng)鍵盤彈窗示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
Android編程實現(xiàn)EditText字數(shù)監(jiān)聽并顯示的方法
這篇文章主要介紹了Android編程實現(xiàn)EditText字數(shù)監(jiān)聽并顯示的方法,涉及Android EditText文本框事件監(jiān)聽與響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下2017-02-02

