suspend fun updateUser(user : User){
userDao.updateUser(user)
}
ViewModel
fun updateUser(user : User){
viewModelScope.launch(Dispatchers.IO) {
repository.updateUser(user)
}
}
업데이트 메소드를 추가해준다.
값 넘겨주기
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val currentItem = userList[position]
val currentId = currentItem.id.toString()
val currentName = currentItem.name
val currentAge = currentItem.age.toString()
holder.binding.idText.text = currentId
holder.binding.nameText.text = currentName
holder.binding.ageText.text = currentAge
holder.binding.itemLayout.setOnClickListener {
val intent = Intent(it.context,UpdateActivity::class.java)
intent.putExtra("currentId", currentId)
intent.putExtra("currentName", currentName)
intent.putExtra("currentAge", currentAge)
it.context.startActivity(intent)
}
}
리싸이클러뷰 어댑터에서 업데이트액티비티에 리싸이클러뷰에서 클릭된 값을 넘겨준다.
UpdateActivity
class UpdateActivity : AppCompatActivity() {
private lateinit var binding : ActivityUpdateBinding
private lateinit var userViewModel : UserViewModel
private var currentId : Int? = null
private lateinit var currentName : String
private var currentAge : Int? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 타이틀 삭제
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
binding = DataBindingUtil.setContentView(this,R.layout.activity_update)
// 뷰모델 연결
userViewModel = ViewModelProvider(this, UserViewModel.Factory(application)).get(UserViewModel::class.java)
// 데이터가 넘어왔을 때
if(intent.hasExtra("currentId") && intent.hasExtra("currentName") && intent.hasExtra("currentAge")){
// 현재 정보를 할당해줌
currentId = Integer.parseInt(intent.getStringExtra("currentId"))
currentName = intent.getStringExtra("currentName").toString()
currentAge = Integer.parseInt(intent.getStringExtra("currentAge"))
// 에디트뷰에 수정하기 전 값을 보여줌
binding.nameEditView.setText(currentName)
binding.ageEditView.setText(currentAge.toString())
}
else{
Toast.makeText(this,"불러오기 실패", Toast.LENGTH_SHORT).show()
}
// 수정 버튼 클릭 시
binding.updateBtn.setOnClickListener {
val name = binding.nameEditView.text.toString()
var age = binding.ageEditView.text.toString()
// 입력하지 않았을 때
if ( TextUtils.isEmpty(name) || TextUtils.isEmpty(age) ){
Toast.makeText(this, "데이터를 입력해주세요.", Toast.LENGTH_SHORT).show()
}
// 입력 창이 비어 있지 않을 때
else{
val user = User(currentId!!,name,Integer.parseInt(age))
userViewModel.updateUser(user)
Toast.makeText(this, "이름 : $name , 나이 : $age 로 수정", Toast.LENGTH_SHORT).show()
finish()
}
}
// 취소 버튼 클릭 시
binding.cancelBtn.setOnClickListener {
finish()
}
}
}
메인과 동일하게 뷰모델을 연결해주고,
넘어온 값을 현재값으로 저장해준다.
수정 버튼이 클릭됐을 때, 비어있는지 확인하고
뷰모델의 update메소드에 현재 값을 넘겨준다.
아이템을 클릭하면 수정할 수 있는 창이 뜨게 되고,
수정하면 반영된 것을 리스트에서 확인할 수 있다.
4️⃣ 데이터 삭제하기 (Delete)
삭제도 쉽게 하기위해 수정 레이아웃에서 할 것이다.
레이아웃에서 삭제버튼을 만들어주고
Dao
@Delete
suspend fun deleteUser(user : User)
repository
suspend fun deleteUser(user : User){
userDao.deleteUser(user)
}
ViewModel
fun deleteUser(user : User){
viewModelScope.launch(Dispatchers.IO) {
repository.deleteUser(user)
}
}
각각 작성해준후
업데이트 액티비티
// 삭제 버튼 클릭 시
binding.deleteBtn.setOnClickListener {
val user = User(currentId!!,currentName,currentAge!!)
userViewModel.deleteUser(user)
Toast.makeText(this, "이름 : $currentName , 나이 : $currentAge 삭제", Toast.LENGTH_SHORT).show()
finish()
}