Tuesday, June 8, 2021

【ANDROID STUDIO】More Efficient RecyclerView Room Data Persistence Library

package com.example.roomdemo

import android.util.Patterns
import androidx.databinding.Bindable
import androidx.databinding.Observable
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.roomdemo.db.Subscriber
import com.example.roomdemo.db.SubscriberRepository
import kotlinx.coroutines.launch

class SubscriberViewModel(private val repository: SubscriberRepository) : ViewModel(),Observable {

val subscribers = repository.subscribers
private var isUpdateOrDelete = false
private lateinit var subscriberToUpdateOrDelete : Subscriber
@Bindable
val inputName = MutableLiveData<String>()
@Bindable
val inputEmail = MutableLiveData<String>()
@Bindable
val saveOrUpdateButtonText = MutableLiveData<String>()
@Bindable
val clearAllOrDeleteButtonText = MutableLiveData<String>()
private val statusMessage = MutableLiveData<Event<String>>()

val message : LiveData<Event<String>>
get() = statusMessage

init {
saveOrUpdateButtonText.value = "Save"
clearAllOrDeleteButtonText.value = "Clear All"
}

fun saveOrUpdate() {
if (inputName.value == null) {
statusMessage.value = Event("Please enter subscriber's name")
} else if (inputEmail.value == null) {
statusMessage.value = Event("Please enter subscriber's email")
} else if (!Patterns.EMAIL_ADDRESS.matcher(inputEmail.value!!).matches()) {
statusMessage.value = Event("Please enter a correct email address")
} else {
if (isUpdateOrDelete) {
subscriberToUpdateOrDelete.name = inputName.value!!
subscriberToUpdateOrDelete.email = inputEmail.value!!
update(subscriberToUpdateOrDelete)
} else {

val name = inputName.value!!
val email = inputEmail.value!!
insert(Subscriber(0, name, email))
inputName.value = null
inputEmail.value = null
}
}
}

fun clearAllOrDelete() {
if(isUpdateOrDelete) {
delete(subscriberToUpdateOrDelete)
}else {
clearAll()
}
}

fun insert(subscriber: Subscriber)= viewModelScope.launch {
val newRowId: Long = repository.insert(subscriber)
if(newRowId>-1) {
statusMessage.value = Event("Subscriber Inserted Successfully $newRowId")
}else{
statusMessage.value = Event("Error Occurred")
}
}

fun update(subscriber: Subscriber) = viewModelScope.launch {
val noOfRows = repository.update(subscriber)
if(noOfRows>0) {
inputName.value = null
inputEmail.value = null
isUpdateOrDelete = false
saveOrUpdateButtonText.value = "Save"
clearAllOrDeleteButtonText.value = "Clear All"
statusMessage.value = Event("$noOfRows Row Updated Successfully")
}else{
statusMessage.value = Event("Error Occurred")
}
}

fun delete(subscriber: Subscriber) = viewModelScope.launch {
val noOfRowsDeleted = repository.delete(subscriber)
if(noOfRowsDeleted>0){
inputName.value = null
inputEmail.value = null
isUpdateOrDelete = false
saveOrUpdateButtonText.value = "Save"
clearAllOrDeleteButtonText.value = "Clear All"
statusMessage.value = Event("$noOfRowsDeleted Row Deleted Successfully")
}else{
statusMessage.value = Event(
"Error Occurred"
)
}


}

fun clearAll()=viewModelScope.launch {
val noOfRowsDeleted = repository.deleteAll()
if(noOfRowsDeleted>0) {
statusMessage.value = Event("$noOfRowsDeleted Deleted Successfully")
}else{
statusMessage.value = Event("Error Occurred")
}
}

fun initUpdateAndDelete(subscriber: Subscriber) {
inputName.value = subscriber.name
inputEmail.value = subscriber.email
isUpdateOrDelete = true
subscriberToUpdateOrDelete = subscriber
saveOrUpdateButtonText.value = "Update"
clearAllOrDeleteButtonText.value = "Delete"

}


override fun removeOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback?) {

}

override fun addOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback?) {

}

} 

package com.example.roomdemo


import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.roomdemo.databinding.ActivityMainBinding
import com.example.roomdemo.db.Subscriber
import com.example.roomdemo.db.SubscriberDatabase
import com.example.roomdemo.db.SubscriberRepository

class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var subscriberViewModel: SubscriberViewModel
private lateinit var adapter: MyRecyclerViewAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
val dao = SubscriberDatabase.getInstance(application).subscriberDAO
val repository = SubscriberRepository(dao)
val factory = SubscriberViewModelFactory(repository)
subscriberViewModel = ViewModelProvider(this,factory).get(SubscriberViewModel::class.java)
binding.myViewModel = subscriberViewModel
binding.lifecycleOwner = this
initRecyclerView()
subscriberViewModel.message.observe(this, Observer {
it.getContentIfNotHandled()?.let {
Toast.makeText(this, it, Toast.LENGTH_LONG).show()
}
})

}

private fun initRecyclerView() {

binding.subscriberRecyclerView.layoutManager = LinearLayoutManager(this)
adapter = MyRecyclerViewAdapter({selecteditem:Subscriber->listItemClicked(selecteditem)})
binding.subscriberRecyclerView.adapter = adapter
displaySubscribersList()

}

private fun displaySubscribersList() {
subscriberViewModel.subscribers.observe(this, Observer {
adapter.setList(it)
adapter.notifyDataSetChanged()

})

}

private fun listItemClicked(subscriber: Subscriber) {
subscriberViewModel.initUpdateAndDelete(subscriber)
}

}

No comments:

Post a Comment

End of Summer Sale ☀️😎

20% OFF Inside!🤯 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏...