最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2022年09月19日 15:49:16   作者:艾陽Blog  
Jetpack是一個由多個技術(shù)庫組成的套件,可幫助開發(fā)者遵循最佳做法,減少樣板代碼并編寫可在各種Android版本和設(shè)備中一致運行的代碼,讓開發(fā)者精力集中編寫重要的代碼

Android Jetpack之ViewModel、LiveData

Android Jetpack之LifeCycle

一、官方推薦的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 RecycleView實現(xiàn)Item拖拽效果

    Android RecycleView實現(xiàn)Item拖拽效果

    RecyclerView是Android一個更強大的控件,其不僅可以實現(xiàn)和ListView同樣的效果,還有優(yōu)化了ListView中的各種不足。本文將介紹通過RecyclerView實現(xiàn)Item拖拽效果以及拖拽位置保存,感興趣的可以參考一下
    2022-01-01
  • 在Android中調(diào)用WebService實例

    在Android中調(diào)用WebService實例

    這篇文章主要介紹了在Android中調(diào)用WebService實例,有需要的朋友可以了解一下。
    2016-11-11
  • Android屏幕旋轉(zhuǎn)之橫屏豎屏切換的實現(xiàn)

    Android屏幕旋轉(zhuǎn)之橫屏豎屏切換的實現(xiàn)

    這篇文章主要介紹了Android屏幕旋轉(zhuǎn)之橫屏豎屏切換的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Android自定義ViewGroup實現(xiàn)九宮格布局

    Android自定義ViewGroup實現(xiàn)九宮格布局

    這篇文章主要為大家詳細介紹了Android如何通過自定義ViewGroup實現(xiàn)九宮格布局,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-12-12
  • Android打包版本號設(shè)置方法

    Android打包版本號設(shè)置方法

    這篇文章主要介紹了Android打包版本號設(shè)置方法,需要的朋友可以參考下
    2017-10-10
  • Android仿String的對象駐留示例分析

    Android仿String的對象駐留示例分析

    這篇文章主要介紹了Android仿String的對象駐留,較為詳細的分析說明了對象駐留的概念及Android實現(xiàn)仿String對象駐留的相關(guān)技巧,需要的朋友可以參考下
    2015-12-12
  • Android高性能日志寫入方案的實現(xiàn)

    Android高性能日志寫入方案的實現(xiàn)

    這篇文章主要給大家介紹了關(guān)于Android高性能日志寫入方案的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Android入門:廣播發(fā)送者與廣播接收者詳細介紹

    Android入門:廣播發(fā)送者與廣播接收者詳細介紹

    本篇文章主要介紹了Android入門:廣播發(fā)送者與廣播接收者,詳細介紹了廣播收發(fā)的原理和代碼,有需要的可以了解一下。
    2016-11-11
  • flutter 實現(xiàn)點擊下拉欄微信右上角彈出窗功能

    flutter 實現(xiàn)點擊下拉欄微信右上角彈出窗功能

    這篇文章主要介紹了flutter 實現(xiàn)彈出窗點擊下拉欄微信右上角彈出窗功能,這段代碼使用的是PopupRoute這個路由類進行實現(xiàn) 的,分步驟通過實例代碼講解的非常詳細,需要的朋友可以參考下
    2021-05-05
  • Android  view自定義實現(xiàn)動態(tài)進度條

    Android view自定義實現(xiàn)動態(tài)進度條

    這篇文章主要介紹了Android view自定義實現(xiàn)動態(tài)進度條的相關(guān)資料,這里提供實例代碼及實現(xiàn)效果圖,需要的朋友可以參考下
    2016-12-12

最新評論

苍梧县| 清水县| 河北区| 图片| 邹平县| 万全县| 阜新| 乾安县| 海宁市| 长宁区| 肇州县| 永康市| 元氏县| 丁青县| 四会市| 无棣县| 秦皇岛市| 冀州市| 磴口县| 灵石县| 平南县| 阜城县| 茶陵县| 通辽市| 西平县| 白沙| 黎川县| 安图县| 南木林县| 灵宝市| 廊坊市| 利辛县| 拉孜县| 鹤岗市| 炉霍县| 舒兰市| 万宁市| 庆城县| 阿克苏市| 平武县| 宁阳县|